From 4bd58c868824c42b7907c454e7666ba6c5ee9afa Mon Sep 17 00:00:00 2001 From: Dancovich Date: Tue, 27 Aug 2013 15:01:30 -0300 Subject: [PATCH] Implementação de testes da extensão demoiselle-jta. --- impl/extension/jta/pom.xml | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------- impl/extension/jta/src/test/java/br/gov/frameworkdemoiselle/transaction/JTATransactionTest.java | 231 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- impl/extension/jta/src/test/java/jtatransaction/interceptor/InterceptorJTATransactionTest.java | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity1.java | 29 +++++++++++++++++++++++++++++ impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity2.java | 29 +++++++++++++++++++++++++++++ impl/extension/jta/src/test/java/jtatransaction/interceptor/TransactionalBusiness.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/jta/src/test/java/jtatransaction/manual/ManualJTATransactionTest.java | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity1.java | 29 +++++++++++++++++++++++++++++ impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity2.java | 29 +++++++++++++++++++++++++++++ impl/extension/jta/src/test/java/test/Tests.java | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/jta/src/test/resources/arquillian.xml | 47 +++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/jta/src/test/resources/beans.xml | 11 +++++++++++ impl/extension/jta/src/test/resources/interceptor/persistence.xml | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ impl/extension/jta/src/test/resources/log/log4j.properties | 42 ++++++++++++++++++++++++++++++++++++++++++ impl/extension/jta/src/test/resources/log4j.properties | 42 ------------------------------------------ impl/extension/jta/src/test/resources/manual/persistence.xml | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 16 files changed, 880 insertions(+), 310 deletions(-) delete mode 100644 impl/extension/jta/src/test/java/br/gov/frameworkdemoiselle/transaction/JTATransactionTest.java create mode 100644 impl/extension/jta/src/test/java/jtatransaction/interceptor/InterceptorJTATransactionTest.java create mode 100644 impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity1.java create mode 100644 impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity2.java create mode 100644 impl/extension/jta/src/test/java/jtatransaction/interceptor/TransactionalBusiness.java create mode 100644 impl/extension/jta/src/test/java/jtatransaction/manual/ManualJTATransactionTest.java create mode 100644 impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity1.java create mode 100644 impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity2.java create mode 100644 impl/extension/jta/src/test/java/test/Tests.java create mode 100644 impl/extension/jta/src/test/resources/arquillian.xml create mode 100644 impl/extension/jta/src/test/resources/beans.xml create mode 100644 impl/extension/jta/src/test/resources/interceptor/persistence.xml create mode 100755 impl/extension/jta/src/test/resources/log/log4j.properties delete mode 100755 impl/extension/jta/src/test/resources/log4j.properties create mode 100644 impl/extension/jta/src/test/resources/manual/persistence.xml diff --git a/impl/extension/jta/pom.xml b/impl/extension/jta/pom.xml index c212bec..fd368ee 100755 --- a/impl/extension/jta/pom.xml +++ b/impl/extension/jta/pom.xml @@ -1,40 +1,26 @@ - - + + 4.0.0 @@ -71,8 +57,91 @@ javax.transaction jta + + + + junit + junit + test + + + + org.jboss.arquillian.core + arquillian-core-api + test + + + + arquillian-embedded + + true + + + + + org.jboss.arquillian.junit + arquillian-junit-container + test + + + org.jboss.arquillian.container + arquillian-glassfish-embedded-3.1 + test + + + org.glassfish.main.extras + glassfish-embedded-all + test + + + org.slf4j + slf4j-log4j12 + test + + + org.eclipse.persistence + eclipselink + test + + + org.jboss.shrinkwrap.resolver + shrinkwrap-resolver-impl-maven + test + + + + + + arquillian-test + + + br.gov.frameworkdemoiselle + demoiselle-core + + + javax.enterprise + cdi-api + + + validation-api + javax.validation + + + org.slf4j + slf4j-api + + + org.javassist + javassist + + + + + + + sonatype-nexus-snapshots diff --git a/impl/extension/jta/src/test/java/br/gov/frameworkdemoiselle/transaction/JTATransactionTest.java b/impl/extension/jta/src/test/java/br/gov/frameworkdemoiselle/transaction/JTATransactionTest.java deleted file mode 100644 index c5aa251..0000000 --- a/impl/extension/jta/src/test/java/br/gov/frameworkdemoiselle/transaction/JTATransactionTest.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Demoiselle Framework - * Copyright (C) 2010 SERPRO - * ---------------------------------------------------------------------------- - * This file is part of Demoiselle Framework. - * - * Demoiselle Framework is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License version 3 - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License version 3 - * along with this program; if not, see - * or write to the Free Software Foundation, Inc., 51 Franklin Street, - * Fifth Floor, Boston, MA 02110-1301, USA. - * ---------------------------------------------------------------------------- - * Este arquivo é parte do Framework Demoiselle. - * - * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou - * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação - * do Software Livre (FSF). - * - * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA - * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou - * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português - * para maiores detalhes. - * - * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título - * "LICENCA.txt", junto com esse programa. Se não, acesse - * ou escreva para a Fundação do Software Livre (FSF) Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - */ - -package br.gov.frameworkdemoiselle.transaction; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.expectLastCall; -import static org.powermock.api.easymock.PowerMock.mockStatic; -import static org.powermock.api.easymock.PowerMock.replay; -import static org.powermock.api.easymock.PowerMock.replayAll; -import static org.powermock.api.easymock.PowerMock.verify; -import static org.powermock.reflect.Whitebox.setInternalState; - -import javax.transaction.HeuristicMixedException; -import javax.transaction.HeuristicRollbackException; -import javax.transaction.NotSupportedException; -import javax.transaction.RollbackException; -import javax.transaction.SystemException; -import javax.transaction.UserTransaction; - -import junit.framework.Assert; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import br.gov.frameworkdemoiselle.DemoiselleException; -import br.gov.frameworkdemoiselle.util.Beans; - -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Beans.class }) -public class JTATransactionTest { - - private UserTransaction userTransaction; - - private JTATransaction jtaTransaction; - - @Before - public void setUp() { - userTransaction = createMock(UserTransaction.class); - jtaTransaction = new JTATransaction(); - - setInternalState(jtaTransaction, UserTransaction.class, userTransaction); - } - - @Test - public void testGetDElegateWithUserTransactionNull() throws SystemException { - mockStatic(Beans.class); - userTransaction = null; - setInternalState(jtaTransaction, UserTransaction.class, userTransaction); - userTransaction = createMock(UserTransaction.class); - expect(Beans.getReference(UserTransaction.class)).andReturn(userTransaction); - replayAll(); - - // Assert.assertEquals(userTransaction, jtaTransaction.getDelegate()); - } - - @Test - public void testGetDElegateWithUserTransactionIsNotNull() throws SystemException { - // Assert.assertEquals(userTransaction, jtaTransaction.getDelegate()); - } - - @Test - public void testIsActiveWithStatusEqualsActive() throws SystemException { - expect(userTransaction.getStatus()).andReturn(Integer.valueOf(0)); - replay(userTransaction); - Assert.assertTrue(this.jtaTransaction.isActive()); - } - - @Test - public void testIsActiveWithStatusEqualsMarkedRollback() throws SystemException { - expect(userTransaction.getStatus()).andReturn(Integer.valueOf(1)).times(2); - replay(userTransaction); - Assert.assertTrue(this.jtaTransaction.isActive()); - } - - @Test - public void testIsMarkedRollback() throws SystemException { - expect(userTransaction.getStatus()).andReturn(Integer.valueOf(1)); - replay(userTransaction); - Assert.assertTrue(this.jtaTransaction.isMarkedRollback()); - } - - @Test - public void testBegin() throws SystemException, NotSupportedException { - userTransaction.begin(); - replay(userTransaction); - this.jtaTransaction.begin(); - verify(); - } - - @Test - public void testCommit() throws SystemException, NotSupportedException, SecurityException, IllegalStateException, - RollbackException, HeuristicMixedException, HeuristicRollbackException { - userTransaction.commit(); - replay(userTransaction); - this.jtaTransaction.commit(); - verify(); - } - - @Test - public void testRollback() throws SystemException, NotSupportedException { - userTransaction.rollback(); - replay(userTransaction); - this.jtaTransaction.rollback(); - verify(); - } - - @Test - public void testSetRollbackOnly() throws SystemException, NotSupportedException { - userTransaction.setRollbackOnly(); - replay(userTransaction); - this.jtaTransaction.setRollbackOnly(); - verify(); - } - - @Test - public void testIsActiveThrowsSystemException() throws SystemException { - expect(userTransaction.getStatus()).andThrow(new SystemException()); - replay(userTransaction); - try { - this.jtaTransaction.isActive(); - Assert.fail(); - } catch (DemoiselleException cause) { - Assert.assertTrue(true); - } - } - - @Test - public void testIsMarkedRollbackThrowsSystemException() throws SystemException { - expect(userTransaction.getStatus()).andThrow(new SystemException()); - replay(userTransaction); - try { - this.jtaTransaction.isMarkedRollback(); - Assert.fail(); - } catch (DemoiselleException cause) { - Assert.assertTrue(true); - } - } - - @Test - public void testBeginThrowsException() throws SystemException, NotSupportedException { - userTransaction.begin(); - expectLastCall().andThrow(new SystemException()); - replay(userTransaction); - try { - this.jtaTransaction.begin(); - Assert.fail(); - } catch (DemoiselleException cause) { - Assert.assertTrue(true); - } - } - - @Test - public void testCommitThrowsException() throws SystemException, SecurityException, IllegalStateException, - RollbackException, HeuristicMixedException, HeuristicRollbackException { - userTransaction.commit(); - expectLastCall().andThrow(new SystemException()); - replay(userTransaction); - try { - this.jtaTransaction.commit(); - Assert.fail(); - } catch (DemoiselleException cause) { - Assert.assertTrue(true); - } - } - - @Test - public void testRollbackThrowsSystemException() throws SystemException { - userTransaction.rollback(); - expectLastCall().andThrow(new SystemException()); - replay(userTransaction); - try { - this.jtaTransaction.rollback(); - Assert.fail(); - } catch (DemoiselleException cause) { - Assert.assertTrue(true); - } - } - - @Test - public void testSetRollbackOnlyThrowsSystemException() throws SystemException { - userTransaction.setRollbackOnly(); - expectLastCall().andThrow(new SystemException()); - replay(userTransaction); - try { - this.jtaTransaction.setRollbackOnly(); - Assert.fail(); - } catch (DemoiselleException cause) { - Assert.assertTrue(true); - } - } - -} diff --git a/impl/extension/jta/src/test/java/jtatransaction/interceptor/InterceptorJTATransactionTest.java b/impl/extension/jta/src/test/java/jtatransaction/interceptor/InterceptorJTATransactionTest.java new file mode 100644 index 0000000..9c66e23 --- /dev/null +++ b/impl/extension/jta/src/test/java/jtatransaction/interceptor/InterceptorJTATransactionTest.java @@ -0,0 +1,105 @@ +package jtatransaction.interceptor; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNull; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TransactionRequiredException; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import test.Tests; +import br.gov.frameworkdemoiselle.DemoiselleException; +import br.gov.frameworkdemoiselle.transaction.JTATransaction; +import br.gov.frameworkdemoiselle.transaction.TransactionContext; +import br.gov.frameworkdemoiselle.util.Beans; + +@RunWith(Arquillian.class) +public class InterceptorJTATransactionTest { + + private static final String PATH = "src/test/resources/interceptor"; + + private TransactionContext transactionContext; + + @PersistenceContext(unitName="pu1") + private EntityManager em1; + + @PersistenceContext(unitName="pu2") + private EntityManager em2; + + @Deployment + public static WebArchive createDeployment() { + WebArchive deployment = Tests.createDeployment(InterceptorJTATransactionTest.class); + deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); + + return deployment; + } + + @Before + public void clearDatabase(){ + transactionContext = Beans.getReference(TransactionContext.class); + + transactionContext.getCurrentTransaction().begin(); + em1.joinTransaction(); + em2.joinTransaction(); + em1.createQuery("DELETE FROM MyEntity1").executeUpdate(); + em2.createQuery("DELETE FROM MyEntity2").executeUpdate(); + em1.flush(); + em2.flush(); + em1.clear(); + em2.clear(); + transactionContext.getCurrentTransaction().commit(); + } + + @Test + public void checkJTATransactionType() { + assertEquals(JTATransaction.class, transactionContext.getCurrentTransaction().getClass()); + } + + @Test + public void commitWithSuccess() { + + TransactionalBusiness business = Beans.getReference(TransactionalBusiness.class); + + business.commitWithSuccess(); + + MyEntity1 persisted1 = em1.find(MyEntity1.class, TransactionalBusiness.createId("id-1")); + MyEntity2 persisted2 = em2.find(MyEntity2.class, TransactionalBusiness.createId("id-2")); + + assertEquals("desc-1", persisted1.getDescription()); + assertEquals("desc-2", persisted2.getDescription()); + + assertFalse(transactionContext.getCurrentTransaction().isActive()); + + } + + @Test(expected = TransactionRequiredException.class) + public void checkNoTransactionAutomaticallyLoaded() { + TransactionalBusiness business = Beans.getReference(TransactionalBusiness.class); + business.checkNoTransactionAutomaticallyLoaded(); + } + + @Test + public void rollbackWithSuccess() { + TransactionalBusiness business = Beans.getReference(TransactionalBusiness.class); + try{ + business.rollbackWithSuccess(); + } + catch(DemoiselleException de){ + //Exceção esperada + } + + MyEntity1 persisted1 = em1.find(MyEntity1.class, TransactionalBusiness.createId("id-3")); + MyEntity2 persisted2 = em2.find(MyEntity2.class, TransactionalBusiness.createId("id-4")); + assertNull(persisted1); + assertNull(persisted2); + } + +} diff --git a/impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity1.java b/impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity1.java new file mode 100644 index 0000000..003a92f --- /dev/null +++ b/impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity1.java @@ -0,0 +1,29 @@ +package jtatransaction.interceptor; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class MyEntity1 { + + @Id + private String id; + + private String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity2.java b/impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity2.java new file mode 100644 index 0000000..fdd6b36 --- /dev/null +++ b/impl/extension/jta/src/test/java/jtatransaction/interceptor/MyEntity2.java @@ -0,0 +1,29 @@ +package jtatransaction.interceptor; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class MyEntity2 { + + @Id + private String id; + + private String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/impl/extension/jta/src/test/java/jtatransaction/interceptor/TransactionalBusiness.java b/impl/extension/jta/src/test/java/jtatransaction/interceptor/TransactionalBusiness.java new file mode 100644 index 0000000..70640c3 --- /dev/null +++ b/impl/extension/jta/src/test/java/jtatransaction/interceptor/TransactionalBusiness.java @@ -0,0 +1,73 @@ +package jtatransaction.interceptor; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import br.gov.frameworkdemoiselle.DemoiselleException; +import br.gov.frameworkdemoiselle.stereotype.BusinessController; +import br.gov.frameworkdemoiselle.transaction.Transactional; + +@BusinessController +public class TransactionalBusiness { + + @PersistenceContext(unitName="pu1") + private EntityManager em1; + + @PersistenceContext(unitName="pu2") + private EntityManager em2; + + @Transactional + public void commitWithSuccess() { + MyEntity1 entity1 = new MyEntity1(); + entity1.setId(createId("id-1")); + entity1.setDescription("desc-1"); + + MyEntity2 entity2 = new MyEntity2(); + entity2.setId(createId("id-2")); + entity2.setDescription("desc-2"); + + em1.joinTransaction(); + em2.joinTransaction(); + + em1.persist(entity1); + em2.persist(entity2); + + em1.flush(); + em2.flush(); + } + + public void checkNoTransactionAutomaticallyLoaded() { + MyEntity1 entity = new MyEntity1(); + entity.setId(createId("id-2")); + + em1.persist(entity); + em1.flush(); + } + + @Transactional + public void rollbackWithSuccess() { + MyEntity1 entity1 = new MyEntity1(); + entity1.setId(createId("id-3")); + + MyEntity2 entity2 = new MyEntity2(); + entity2.setId(createId("id-4")); + + em1.joinTransaction(); + em2.joinTransaction(); + + em1.persist(entity1); + em2.persist(entity2); + em1.flush(); + em2.flush(); + + em1.clear(); + em2.clear(); + + throw new DemoiselleException("Forçando rollback"); + } + + public static String createId(String id) { + return TransactionalBusiness.class.getName() + "_" + id; + } + +} diff --git a/impl/extension/jta/src/test/java/jtatransaction/manual/ManualJTATransactionTest.java b/impl/extension/jta/src/test/java/jtatransaction/manual/ManualJTATransactionTest.java new file mode 100644 index 0000000..3024066 --- /dev/null +++ b/impl/extension/jta/src/test/java/jtatransaction/manual/ManualJTATransactionTest.java @@ -0,0 +1,149 @@ +package jtatransaction.manual; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertNull; +import static junit.framework.Assert.assertTrue; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TransactionRequiredException; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import test.Tests; +import br.gov.frameworkdemoiselle.transaction.JTATransaction; +import br.gov.frameworkdemoiselle.transaction.Transaction; +import br.gov.frameworkdemoiselle.transaction.TransactionContext; +import br.gov.frameworkdemoiselle.util.Beans; + +@RunWith(Arquillian.class) +public class ManualJTATransactionTest { + + private static final String PATH = "src/test/resources/manual"; + + private TransactionContext transactionContext; + + @PersistenceContext(unitName="pu1") + private EntityManager em1; + + @PersistenceContext(unitName="pu2") + private EntityManager em2; + + @Deployment + public static WebArchive createDeployment() { + WebArchive deployment = Tests.createDeployment(ManualJTATransactionTest.class); + deployment.addAsResource(Tests.createFileAsset(PATH + "/persistence.xml"), "META-INF/persistence.xml"); + + return deployment; + } + + @Before + public void clearDatabase(){ + transactionContext = Beans.getReference(TransactionContext.class); + + transactionContext.getCurrentTransaction().begin(); + em1.joinTransaction(); + em2.joinTransaction(); + em1.createQuery("DELETE FROM MyEntity1").executeUpdate(); + em2.createQuery("DELETE FROM MyEntity2").executeUpdate(); + em1.flush(); + em2.flush(); + em1.clear(); + em2.clear(); + transactionContext.getCurrentTransaction().commit(); + } + + @Test + public void checkJTATransactionType() { + assertEquals(JTATransaction.class, transactionContext.getCurrentTransaction().getClass()); + } + + @Test + public void commitWithSuccess() { + Transaction transaction = transactionContext.getCurrentTransaction(); + + MyEntity1 entity1 = new MyEntity1(); + entity1.setId(createId("id-1")); + entity1.setDescription("desc-1"); + + MyEntity2 entity2 = new MyEntity2(); + entity2.setId(createId("id-2")); + entity2.setDescription("desc-2"); + + assertFalse(transaction.isActive()); + + transaction.begin(); + assertTrue(transaction.isActive()); + + em1.joinTransaction(); + em2.joinTransaction(); + + em1.persist(entity1); + em2.persist(entity2); + + transaction.commit(); + em1.clear(); + em2.clear(); + + MyEntity1 persisted1 = em1.find(MyEntity1.class, createId("id-1")); + MyEntity2 persisted2 = em2.find(MyEntity2.class, createId("id-2")); + + assertEquals("desc-1", persisted1.getDescription()); + assertEquals("desc-2", persisted2.getDescription()); + } + + @Test(expected = TransactionRequiredException.class) + public void checkNoTransactionAutomaticallyLoaded() { + MyEntity1 entity = new MyEntity1(); + entity.setId(createId("id-2")); + + em1.persist(entity); + em1.flush(); + } + + @Test + public void rollbackWithSuccess() { + Transaction transaction = transactionContext.getCurrentTransaction(); + + MyEntity1 entity1 = new MyEntity1(); + entity1.setId(createId("id-3")); + + MyEntity2 entity2 = new MyEntity2(); + entity2.setId(createId("id-4")); + + assertFalse(transaction.isMarkedRollback()); + transaction.begin(); + assertTrue(transaction.isActive()); + + em1.joinTransaction(); + em2.joinTransaction(); + + em1.persist(entity1); + em2.persist(entity2); + em1.flush(); + em2.flush(); + transaction.setRollbackOnly(); + + if (transaction.isMarkedRollback()) { + transaction.rollback(); + } + + em1.clear(); + em2.clear(); + + MyEntity1 persisted1 = em1.find(MyEntity1.class, createId("id-3")); + MyEntity2 persisted2 = em2.find(MyEntity2.class, createId("id-4")); + assertNull(persisted1); + assertNull(persisted2); + } + + private String createId(String id) { + return this.getClass().getName() + "_" + id; + } +} diff --git a/impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity1.java b/impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity1.java new file mode 100644 index 0000000..0c67df0 --- /dev/null +++ b/impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity1.java @@ -0,0 +1,29 @@ +package jtatransaction.manual; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class MyEntity1 { + + @Id + private String id; + + private String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity2.java b/impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity2.java new file mode 100644 index 0000000..be43de8 --- /dev/null +++ b/impl/extension/jta/src/test/java/jtatransaction/manual/MyEntity2.java @@ -0,0 +1,29 @@ +package jtatransaction.manual; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class MyEntity2 { + + @Id + private String id; + + private String description; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/impl/extension/jta/src/test/java/test/Tests.java b/impl/extension/jta/src/test/java/test/Tests.java new file mode 100644 index 0000000..e7a8cf6 --- /dev/null +++ b/impl/extension/jta/src/test/java/test/Tests.java @@ -0,0 +1,87 @@ +/* + * Demoiselle Framework + * Copyright (C) 2010 SERPRO + * ---------------------------------------------------------------------------- + * This file is part of Demoiselle Framework. + * + * Demoiselle Framework is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License version 3 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License version 3 + * along with this program; if not, see + * or write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301, USA. + * ---------------------------------------------------------------------------- + * Este arquivo é parte do Framework Demoiselle. + * + * O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou + * modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação + * do Software Livre (FSF). + * + * Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA + * GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou + * APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português + * para maiores detalhes. + * + * Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título + * "LICENCA.txt", junto com esse programa. Se não, acesse + * ou escreva para a Fundação do Software Livre (FSF) Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + */ + +package test; + +import java.io.File; +import java.util.Locale; + +import javax.enterprise.inject.Default; +import javax.enterprise.inject.Produces; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.FileAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.junit.Ignore; + +import br.gov.frameworkdemoiselle.transaction.JTATransaction; + +@Ignore +public final class Tests { + + private Tests() { + } + + public static WebArchive createDeployment(final Class baseClass) { + return createDeployment().addPackages(true, baseClass.getPackage()); + } + + public static WebArchive createDeployment() { + File[] libs = Maven.resolver().offline().loadPomFromFile("pom.xml" , "arquillian-test") + .importCompileAndRuntimeDependencies().resolve().withTransitivity().asFile(); + + return ShrinkWrap + .create(WebArchive.class) + .addClass(Tests.class) + .addClass(JTATransaction.class) + .addAsResource(createFileAsset("src/main/resources/demoiselle-jta-bundle.properties") , "demoiselle-jta-bundle.properties" ) + .addAsResource(createFileAsset("src/test/resources/log/log4j.properties") , "log4j.properties" ) + .addAsWebInfResource(createFileAsset("src/test/resources/beans.xml"), "beans.xml") + .addAsLibraries(libs); + } + + public static FileAsset createFileAsset(final String pathname) { + return new FileAsset(new File(pathname)); + } + + @Default + @Produces + public Locale create() { + return Locale.getDefault(); + } +} diff --git a/impl/extension/jta/src/test/resources/arquillian.xml b/impl/extension/jta/src/test/resources/arquillian.xml new file mode 100644 index 0000000..c2f0f22 --- /dev/null +++ b/impl/extension/jta/src/test/resources/arquillian.xml @@ -0,0 +1,47 @@ + + + + + + + \ No newline at end of file diff --git a/impl/extension/jta/src/test/resources/beans.xml b/impl/extension/jta/src/test/resources/beans.xml new file mode 100644 index 0000000..d85497f --- /dev/null +++ b/impl/extension/jta/src/test/resources/beans.xml @@ -0,0 +1,11 @@ + + + + br.gov.frameworkdemoiselle.transaction.TransactionalInterceptor + br.gov.frameworkdemoiselle.security.RequiredPermissionInterceptor + br.gov.frameworkdemoiselle.security.RequiredRoleInterceptor + br.gov.frameworkdemoiselle.exception.ExceptionHandlerInterceptor + + + diff --git a/impl/extension/jta/src/test/resources/interceptor/persistence.xml b/impl/extension/jta/src/test/resources/interceptor/persistence.xml new file mode 100644 index 0000000..10c461d --- /dev/null +++ b/impl/extension/jta/src/test/resources/interceptor/persistence.xml @@ -0,0 +1,72 @@ + + + + + org.eclipse.persistence.jpa.PersistenceProvider + + jdbc/__TimerPool + + jtatransaction.interceptor.MyEntity1 + jtatransaction.interceptor.MyEntity2 + + + + + + + + + + + org.eclipse.persistence.jpa.PersistenceProvider + + jdbc/__TimerPool + + jtatransaction.interceptor.MyEntity1 + jtatransaction.interceptor.MyEntity2 + + + + + + + + + + \ No newline at end of file diff --git a/impl/extension/jta/src/test/resources/log/log4j.properties b/impl/extension/jta/src/test/resources/log/log4j.properties new file mode 100755 index 0000000..48a89ba --- /dev/null +++ b/impl/extension/jta/src/test/resources/log/log4j.properties @@ -0,0 +1,42 @@ +# Demoiselle Framework +# Copyright (C) 2010 SERPRO +# ---------------------------------------------------------------------------- +# This file is part of Demoiselle Framework. +# +# Demoiselle Framework is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public License version 3 +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License version 3 +# along with this program; if not, see +# or write to the Free Software Foundation, Inc., 51 Franklin Street, +# Fifth Floor, Boston, MA 02110-1301, USA. +# ---------------------------------------------------------------------------- +# Este arquivo é parte do Framework Demoiselle. +# +# O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou +# modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação +# do Software Livre (FSF). +# +# Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA +# GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou +# APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português +# para maiores detalhes. +# +# Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título +# "LICENCA.txt", junto com esse programa. Se não, acesse +# ou escreva para a Fundação do Software Livre (FSF) Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. + +log4j.rootCategory=INFO, stdout + +log4j.logger.br.gov.frameworkdemoiselle=TRACE + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%-5p [%c{1}] %m%n diff --git a/impl/extension/jta/src/test/resources/log4j.properties b/impl/extension/jta/src/test/resources/log4j.properties deleted file mode 100755 index 48a89ba..0000000 --- a/impl/extension/jta/src/test/resources/log4j.properties +++ /dev/null @@ -1,42 +0,0 @@ -# Demoiselle Framework -# Copyright (C) 2010 SERPRO -# ---------------------------------------------------------------------------- -# This file is part of Demoiselle Framework. -# -# Demoiselle Framework is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public License version 3 -# as published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License version 3 -# along with this program; if not, see -# or write to the Free Software Foundation, Inc., 51 Franklin Street, -# Fifth Floor, Boston, MA 02110-1301, USA. -# ---------------------------------------------------------------------------- -# Este arquivo é parte do Framework Demoiselle. -# -# O Framework Demoiselle é um software livre; você pode redistribuí-lo e/ou -# modificá-lo dentro dos termos da GNU LGPL versão 3 como publicada pela Fundação -# do Software Livre (FSF). -# -# Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA -# GARANTIA; sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou -# APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU/LGPL em português -# para maiores detalhes. -# -# Você deve ter recebido uma cópia da GNU LGPL versão 3, sob o título -# "LICENCA.txt", junto com esse programa. Se não, acesse -# ou escreva para a Fundação do Software Livre (FSF) Inc., -# 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. - -log4j.rootCategory=INFO, stdout - -log4j.logger.br.gov.frameworkdemoiselle=TRACE - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%-5p [%c{1}] %m%n diff --git a/impl/extension/jta/src/test/resources/manual/persistence.xml b/impl/extension/jta/src/test/resources/manual/persistence.xml new file mode 100644 index 0000000..c413730 --- /dev/null +++ b/impl/extension/jta/src/test/resources/manual/persistence.xml @@ -0,0 +1,72 @@ + + + + + org.eclipse.persistence.jpa.PersistenceProvider + + jdbc/__TimerPool + + jtatransaction.manual.MyEntity1 + jtatransaction.manual.MyEntity2 + + + + + + + + + + + org.eclipse.persistence.jpa.PersistenceProvider + + jdbc/__TimerPool + + jtatransaction.manual.MyEntity1 + jtatransaction.manual.MyEntity2 + + + + + + + + + + \ No newline at end of file -- libgit2 0.21.2