You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2006/08/24 20:49:35 UTC

svn commit: r434468 - in /geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction: ./ jpa/ jta11/ mockjpa/

Author: djencks
Date: Thu Aug 24 11:49:35 2006
New Revision: 434468

URL: http://svn.apache.org/viewvc?rev=434468&view=rev
Log:
Add some tests of TransactionSynchronizationRegistry and a cmp EntityManager

Added:
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java   (with props)
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/TransactionSynchronizationRegistryTest.java   (with props)
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java   (with props)
    geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManagerFactory.java   (with props)

Added: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java?rev=434468&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java Thu Aug 24 11:49:35 2006
@@ -0,0 +1,168 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.jpa;
+
+import java.util.Map;
+import java.util.HashMap;
+
+import javax.persistence.EntityManager;
+import javax.persistence.TransactionRequiredException;
+
+import junit.framework.TestCase;
+import org.apache.geronimo.transaction.jta11.GeronimoTransactionManagerJTA11;
+import org.apache.geronimo.transaction.mockjpa.MockEntityManagerFactory;
+import org.apache.geronimo.transaction.mockjpa.MockEntityManager;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class CMPEntityManagerTest extends TestCase {
+
+    private GeronimoTransactionManagerJTA11 tm;
+    private String persistenceUnit = "foo";
+    private MockEntityManagerFactory entityManagerFactory;
+
+    protected void setUp() throws Exception {
+        tm  = new GeronimoTransactionManagerJTA11();
+        entityManagerFactory = new MockEntityManagerFactory();
+    }
+
+    /**
+     * section 5.8.2
+     * use the same persistence context for all work in a tx
+     */
+    public void testSamePersistenceContext() throws Exception {
+        tm.begin();
+        CMPEntityManager entityManager1 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        EntityManager pc1 = entityManager1.find(EntityManager.class, "this");
+        CMPEntityManager entityManager2 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        EntityManager pc2 = entityManager2.find(EntityManager.class, "this");
+        assertSame("Should get same entity manager for all work in a tx", pc1, pc2);
+        tm.commit();
+    }
+
+    /**
+     * section 5.9.1
+     * close or cleared is called when tx commits
+     */
+    public void testCloseOnCommit() throws Exception {
+        tm.begin();
+        CMPEntityManager entityManager1 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        MockEntityManager pc1 = (MockEntityManager) entityManager1.find(EntityManager.class, "this");
+        assertTrue("entityManager should not be closed or cleared", !pc1.isClosed() & !pc1.isCleared());
+        tm.commit();
+        assertTrue("entityManager should be closed or cleared", pc1.isClosed() || pc1.isCleared());
+        tm.begin();
+        CMPEntityManager entityManager2 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        MockEntityManager pc2 = (MockEntityManager) entityManager2.find(EntityManager.class, "this");
+        assertTrue("entityManager should not be closed or cleared", !pc2.isClosed() & !pc2.isCleared());
+        tm.rollback();
+        assertTrue("entityManager should be closed or cleared", pc2.isClosed() || pc2.isCleared());
+    }
+
+    /**
+     * section 5.9.1
+     * transaction required for persist, remove, merge, refresh
+     */
+    public void testTransactionRequired() throws Exception {
+        CMPEntityManager entityManager1 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        try {
+            entityManager1.persist("foo");
+            fail("expected TransactionRequiredException");
+        } catch (TransactionRequiredException e) {
+            //expected
+        } catch (Exception e) {
+            fail ("Wrong exception" + e);
+        }
+        try {
+            entityManager1.remove("foo");
+            fail("expected TransactionRequiredException");
+        } catch (TransactionRequiredException e) {
+            //expected
+        } catch (Exception e) {
+            fail ("Wrong exception" + e);
+        }
+        try {
+            entityManager1.merge("foo");
+            fail("expected TransactionRequiredException");
+        } catch (TransactionRequiredException e) {
+            //expected
+        } catch (Exception e) {
+            fail ("Wrong exception" + e);
+        }
+        try {
+            entityManager1.refresh("foo");
+            fail("expected TransactionRequiredException");
+        } catch (TransactionRequiredException e) {
+            //expected
+        } catch (Exception e) {
+            fail ("Wrong exception" + e);
+        }
+    }
+
+    /**
+     * section 5.9.1
+     * application must not call close on its entityManager
+     */
+    public void testAppCallsCloseForbidden() throws Exception {
+        CMPEntityManager entityManager1 = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        try {
+            entityManager1.close();
+            fail("Application should not be able to call close on its EntityManager");
+        } catch (IllegalStateException e) {
+            //expected
+        }
+        tm.begin();
+        try {
+            entityManager1.close();
+            fail("Application should not be able to call close on its EntityManager");
+        } catch (IllegalStateException e) {
+            //expected
+        }
+        tm.commit();
+    }
+
+
+    /**
+     * section 5.9.1
+     * @throws Exception
+     */
+    public void testNoPropertiesUsed() throws Exception {
+
+        CMPEntityManager entityManager = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, null, true);
+        tm.begin();
+        entityManager.contains("bar");
+        Map props = entityManager.find(Map.class, "properties");
+        assertSame("Props are not null", props, null);
+        tm.commit();
+    }
+
+    /**
+     * section 5.9.1
+     * @throws Exception
+     */
+    public void testPropertiesUsed() throws Exception {
+        Map properties = new HashMap();
+        CMPEntityManager entityManager = new CMPEntityManager(tm, persistenceUnit, entityManagerFactory, properties, true);
+        tm.begin();
+        entityManager.contains("bar");
+        Map props = entityManager.find(Map.class, "properties");
+        assertSame("Props are not what was passed in", props, properties);
+        tm.commit();
+    }
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jpa/CMPEntityManagerTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/TransactionSynchronizationRegistryTest.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/TransactionSynchronizationRegistryTest.java?rev=434468&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/TransactionSynchronizationRegistryTest.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/TransactionSynchronizationRegistryTest.java Thu Aug 24 11:49:35 2006
@@ -0,0 +1,162 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.jta11;
+
+import javax.transaction.Synchronization;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+import javax.transaction.NotSupportedException;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class TransactionSynchronizationRegistryTest extends TestCase {
+
+    private static int beforeCounter = 0;
+    private static int afterCounter = 0;
+
+
+
+    private GeronimoTransactionManagerJTA11 tm;
+
+    private CountingSync interposedSync;
+    private CountingSync normalSync;
+
+    protected void setUp() throws Exception {
+        tm  = new GeronimoTransactionManagerJTA11();
+    }
+
+    private void setUpInterposedSync() throws NotSupportedException, SystemException {
+        interposedSync = new CountingSync();
+        tm.begin();
+        tm.registerInterposedSynchronization(interposedSync);
+    }
+
+    private void setUpSyncs() throws Exception {
+        normalSync = new CountingSync();
+        setUpInterposedSync();
+        tm.getTransaction().registerSynchronization(normalSync);
+    }
+
+
+    public void testInterposedSynchIsCalledOnCommit() throws Exception {
+        setUpInterposedSync();
+        tm.commit();
+        checkInterposedSyncCalled();
+    }
+
+    private void checkInterposedSyncCalled() {
+        assertTrue("interposedSync beforeCompletion was not called", interposedSync.getBeforeCount() != -1);
+        assertTrue("interposedSync afterCompletion was not called", interposedSync.getAfterCount() != -1);
+    }
+
+    public void testInterposedSynchIsCalledOnRollback() throws Exception {
+        setUpInterposedSync();
+        tm.rollback();
+        checkInterposedSyncCalled();
+    }
+
+    public void testInterposedSynchIsCalledOnMarkRollback() throws Exception {
+        setUpInterposedSync();
+        tm.setRollbackOnly();
+        try {
+            tm.commit();
+            fail("expected a RollbackException");
+        } catch (HeuristicMixedException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        } catch (HeuristicRollbackException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        } catch (IllegalStateException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        } catch (RollbackException e) {
+
+        } catch (SecurityException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        } catch (SystemException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        }
+        checkInterposedSyncCalled();
+    }
+
+    public void testSynchCallOrderOnCommit() throws Exception {
+        setUpSyncs();
+        tm.commit();
+        checkSyncCallOrder();
+    }
+
+    private void checkSyncCallOrder() {
+        checkInterposedSyncCalled();
+        assertTrue("interposedSync beforeCompletion was not called after normalSync beforeCompletion", interposedSync.getBeforeCount() > normalSync.getBeforeCount());
+        assertTrue("interposedSync afterCompletion was not called before normalSync beforeCompletion", interposedSync.getAfterCount() < normalSync.getAfterCount());
+    }
+
+    public void testSynchCallOrderOnRollback() throws Exception {
+        setUpSyncs();
+        tm.rollback();
+        checkSyncCallOrder();
+    }
+
+    public void testSynchCallOrderOnMarkRollback() throws Exception {
+        setUpSyncs();
+        tm.setRollbackOnly();
+        try {
+            tm.commit();
+            fail("expected a RollbackException");
+        } catch (HeuristicMixedException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        } catch (HeuristicRollbackException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        } catch (IllegalStateException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        } catch (RollbackException e) {
+
+        } catch (SecurityException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        } catch (SystemException e) {
+            fail("expected a RollbackException not " + e.getClass());
+        }
+        checkSyncCallOrder();
+    }
+
+    private class CountingSync implements Synchronization {
+
+        private int beforeCount = -1;
+        private int afterCount = -1;
+
+        public void beforeCompletion() {
+            beforeCount = beforeCounter++;
+        }
+
+        public void afterCompletion(int i) {
+            afterCount = afterCounter++;
+        }
+
+        public int getBeforeCount() {
+            return beforeCount;
+        }
+
+        public int getAfterCount() {
+            return afterCount;
+        }
+    }
+
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/TransactionSynchronizationRegistryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/TransactionSynchronizationRegistryTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/jta11/TransactionSynchronizationRegistryTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java?rev=434468&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java Thu Aug 24 11:49:35 2006
@@ -0,0 +1,143 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.mockjpa;
+
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.FlushModeType;
+import javax.persistence.LockModeType;
+import javax.persistence.Query;
+import javax.persistence.EntityTransaction;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class MockEntityManager implements EntityManager {
+
+    private final Map properties;
+    private boolean closed = false;
+    private boolean cleared = false;
+
+    public MockEntityManager() {
+        properties = null;
+    }
+
+    public MockEntityManager(Map properties) {
+        this.properties = properties;
+    }
+
+    public void persist(Object object) {
+    }
+
+    public <T> T merge(T t) {
+        return null;
+    }
+
+    public void remove(Object object) {
+    }
+
+    public <T> T find(Class<T> aClass, Object object) {
+        if (aClass == Map.class && "properties".equals(object)) {
+            return (T)properties;
+        }
+        if (aClass == EntityManager.class && "this".equals(object)) {
+            return (T)this;
+        }
+        return null;
+   }
+
+    public <T> T getReference(Class<T> aClass, Object object) {
+        return null;
+    }
+
+    public void flush() {
+    }
+
+    public void setFlushMode(FlushModeType flushModeType) {
+    }
+
+    public FlushModeType getFlushMode() {
+        return null;
+    }
+
+    public void lock(Object object, LockModeType lockModeType) {
+    }
+
+    public void refresh(Object object) {
+    }
+
+    public void clear() {
+        cleared = true;
+    }
+
+    public boolean contains(Object object) {
+        return false;
+    }
+
+    public Query createQuery(String string) {
+        return null;
+    }
+
+    public Query createNamedQuery(String string) {
+        return null;
+    }
+
+    public Query createNativeQuery(String string) {
+        return null;
+    }
+
+    public Query createNativeQuery(String string, Class aClass) {
+        return null;
+    }
+
+    public Query createNativeQuery(String string, String string1) {
+        return null;
+    }
+
+    public void close() {
+        closed = true;
+    }
+
+    public boolean isOpen() {
+        return !closed;
+    }
+
+    public EntityTransaction getTransaction() {
+        return null;
+    }
+
+    public void joinTransaction() {
+    }
+
+    public Object getDelegate() {
+        return null;
+    }
+
+    public Map getProperties() {
+        return properties;
+    }
+
+    public boolean isClosed() {
+        return closed;
+    }
+
+    public boolean isCleared() {
+        return cleared;
+    }
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManagerFactory.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManagerFactory.java?rev=434468&view=auto
==============================================================================
--- geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManagerFactory.java (added)
+++ geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManagerFactory.java Thu Aug 24 11:49:35 2006
@@ -0,0 +1,53 @@
+/**
+ *
+ * Copyright 2006 The Apache Software Foundation
+ *
+ *  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.apache.geronimo.transaction.mockjpa;
+
+import java.util.Map;
+
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityManager;
+
+/**
+ * @version $Rev:$ $Date:$
+ */
+public class MockEntityManagerFactory implements EntityManagerFactory {
+
+    private boolean open = true;
+
+    public EntityManager createEntityManager() {
+        if (!open) {
+            throw new IllegalStateException("closed");
+        }
+        return new MockEntityManager();
+    }
+
+    public EntityManager createEntityManager(Map map) {
+        if (!open) {
+            throw new IllegalStateException("closed");
+        }
+        return new MockEntityManager(map);
+    }
+
+    public void close() {
+        open = false;
+    }
+
+    public boolean isOpen() {
+        return open;
+    }
+}

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManagerFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManagerFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: geronimo/sandbox/jee5-jta/transaction/src/test/org/apache/geronimo/transaction/mockjpa/MockEntityManagerFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain