Author: cschneider
Date: Tue Oct  7 09:44:49 2014
New Revision: 1629842

URL: http://svn.apache.org/r1629842
Log:
Fix and optimize JPA tests

Added:
    
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/AbstractQuiesceJPATest.java
    
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPAInteractionTest.java
Modified:
    
aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/transaction/impl/JTAEntityManagerHandler.java
    
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/JPAInjectionTest.java
    
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java
    
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java
    
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java

Modified: 
aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/transaction/impl/JTAEntityManagerHandler.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/transaction/impl/JTAEntityManagerHandler.java?rev=1629842&r1=1629841&r2=1629842&view=diff
==============================================================================
--- 
aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/transaction/impl/JTAEntityManagerHandler.java
 (original)
+++ 
aries/trunk/jpa/jpa-container-context/src/main/java/org/apache/aries/jpa/container/context/transaction/impl/JTAEntityManagerHandler.java
 Tue Oct  7 09:44:49 2014
@@ -137,39 +137,44 @@ public class JTAEntityManagerHandler imp
 
     @Override
     public Object invoke(Object proxy, Method method, Object[] args) throws 
Throwable {
-        if ("close".equals(method.getName())) {
+        String methodName = method.getName();
+        if ("close".equals(methodName)) {
             throw new 
IllegalStateException(NLS.MESSAGES.getMessage("close.called.on.container.manged.em"));
         }
-        if ("getTransaction".equals(method.getName())) {
+        if ("getTransaction".equals(methodName)) {
             throw new 
IllegalStateException(NLS.MESSAGES.getMessage("getTransaction.called.on.container.managed.em"));
         }
-        if ("isOpen".equals(method.getName())) {
+        if ("isOpen".equals(methodName)) {
             return true;
         }
-        if ("joinTransaction".equals(method.getName())) {
+        if ("joinTransaction".equals(methodName)) {
             // This should be a no-op for a JTA entity manager
             return null;
         }
         
-        if ("postCall".equals(method.getName())) {
+        if ("postCall".equals(methodName)) {
             postCall();
             return null;
         }
         
-        if ("preCall".equals(method.getName())) {
+        if ("preCall".equals(methodName)) {
             preCall();
             return null;
         }
         
-        if ("internalClose".equals(method.getName())) {
+        if ("internalClose".equals(methodName)) {
             internalClose();
             return null;
         }
         
-        boolean forceTransaction = 
transactedMethods.contains(method.getName());
+        boolean forceTransaction = transactedMethods.contains(methodName);
         
         // TODO Check if this can be reached
-        if ("joinTransaction".equals(method.getName())) {
+        if ("joinTransaction".equals(methodName)) {
+            forceTransaction = args[2] != LockModeType.NONE;
+        }
+        
+        if ("find".equals(methodName) && args.length >= 3 && 
args[2].getClass() == LockModeType.class) {
             forceTransaction = args[2] != LockModeType.NONE;
         }
         

Modified: 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/JPAInjectionTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/JPAInjectionTest.java?rev=1629842&r1=1629841&r2=1629842&view=diff
==============================================================================
--- 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/JPAInjectionTest.java
 (original)
+++ 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/blueprint/aries/itest/JPAInjectionTest.java
 Tue Oct  7 09:44:49 2014
@@ -16,7 +16,6 @@
 package org.apache.aries.jpa.blueprint.aries.itest;
 
 import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
 import static org.ops4j.pax.exam.CoreOptions.options;
 
 import org.apache.aries.jpa.blueprint.itest.JPATestBean;

Modified: 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java?rev=1629842&r1=1629841&r2=1629842&view=diff
==============================================================================
--- 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java
 (original)
+++ 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/context/itest/JPAContextTest.java
 Tue Oct  7 09:44:49 2014
@@ -45,11 +45,7 @@ import javax.transaction.UserTransaction
 
 import org.apache.aries.jpa.container.itest.entities.Car;
 import org.apache.aries.jpa.itest.AbstractJPAItest;
-import org.junit.Ignore;
 import org.junit.Test;
-import org.ops4j.pax.exam.Configuration;
-import org.ops4j.pax.exam.CoreOptions;
-import org.ops4j.pax.exam.Option;
 
 public abstract class JPAContextTest extends AbstractJPAItest {
   
@@ -82,7 +78,6 @@ public abstract class JPAContextTest ext
     EntityManagerFactory emf = getProxyEMF(BP_TEST_UNIT);
     
     final EntityManager managedEm = emf.createEntityManager();
-    
     ensureTREBehaviour(false, managedEm, "contains", new Object());
     ensureTREBehaviour(false, managedEm, "createNamedQuery", "hi");
     ensureTREBehaviour(false, managedEm, "createNativeQuery", "hi");
@@ -116,8 +111,7 @@ public abstract class JPAContextTest ext
     ensureTREBehaviour(true, managedEm, "find", Object.class, new Object(), 
LockModeType.OPTIMISTIC);
     ensureTREBehaviour(false, managedEm, "find", Object.class, new Object(), 
LockModeType.NONE, 
         new HashMap());
-    ensureTREBehaviour(true, managedEm, "find", Object.class, new Object(), 
LockModeType.OPTIMISTIC, 
-        new HashMap());
+    ensureTREBehaviour(true, managedEm, "find", Object.class, new Object(), 
LockModeType.OPTIMISTIC, new HashMap());
     ensureTREBehaviour(false, managedEm, "getCriteriaBuilder");
     ensureTREBehaviour(true, managedEm, "getLockMode", new Object());
     ensureTREBehaviour(false, managedEm, "getMetamodel");
@@ -339,35 +333,35 @@ public abstract class JPAContextTest ext
     assertEquals("A1AAA", list.get(1).getNumberPlate());
   }
 
-  private void ensureTREBehaviour(boolean expectedToFail, EntityManager em, 
String methodName, Object... args) throws Exception {
-    List<Class<?>> argTypes = new ArrayList<Class<?>>();
-    for(Object o : args) {
-      if(o instanceof Map)
-        argTypes.add(Map.class);
-      else if (o instanceof CriteriaQuery)
-        argTypes.add(CriteriaQuery.class);
-      else
-        argTypes.add(o.getClass());
-    }
-    
-    Method m = EntityManager.class.getMethod(methodName, 
-        argTypes.toArray(new Class[args.length]));
-    
-    try {
-      m.invoke(em, args);
-      if(expectedToFail)
-        fail("A transaction is required");
-    } catch (InvocationTargetException ite) {
-      if(expectedToFail && 
-          !!!(ite.getCause() instanceof TransactionRequiredException))
-        fail("We got the wrong failure. Expected a 
TransactionRequiredException" +
-                       ", got a " + ite.toString());
-      else if (!!!expectedToFail && 
-          ite.getCause() instanceof TransactionRequiredException)
-        fail("We got the wrong failure. Expected not to get a 
TransactionRequiredException" +
-            ", but we got one anyway!");
+    private void ensureTREBehaviour(boolean expectedToFail, EntityManager em, 
String methodName,
+                                    Object... args) throws Exception {
+        List<Class<?>> argTypes = new ArrayList<Class<?>>();
+        for (Object o : args) {
+            if (o instanceof Map)
+                argTypes.add(Map.class);
+            else if (o instanceof CriteriaQuery)
+                argTypes.add(CriteriaQuery.class);
+            else
+                argTypes.add(o.getClass());
+        }
+
+        Method m = EntityManager.class.getMethod(methodName, 
argTypes.toArray(new Class[args.length]));
+
+        try {
+            m.invoke(em, args);
+            if (expectedToFail) {
+                fail("Should have failed with TransactionRequiredException");
+            }
+        } catch (InvocationTargetException ite) {
+            if (expectedToFail && !(ite.getCause() instanceof 
TransactionRequiredException)) {
+                fail("We got the wrong failure. Expected a 
TransactionRequiredException" + ", got a "
+                     + ite.toString());
+            } else if (!expectedToFail && ite.getCause() instanceof 
TransactionRequiredException) {
+                fail("We got the wrong failure. Expected not to get a 
TransactionRequiredException"
+                     + ", but we got one anyway!");
+            }
+        }
     }
-  }
   
 
 }

Modified: 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java?rev=1629842&r1=1629841&r2=1629842&view=diff
==============================================================================
--- 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java
 (original)
+++ 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/itest/AbstractJPAItest.java
 Tue Oct  7 09:44:49 2014
@@ -43,8 +43,8 @@ public abstract class AbstractJPAItest e
        }
        
        protected EntityManagerFactory getProxyEMF(String name) {
-               return context().getService(EntityManagerFactory.class, 
"(&(osgi.unit.name=" + name + ")" 
-                               + FILTER_CONTAINER_MANAGED + FILTER_PROXY +")");
+               String filter = "(&(osgi.unit.name=" + name + ")" + 
FILTER_CONTAINER_MANAGED + FILTER_PROXY +")";
+        return context().getService(EntityManagerFactory.class, filter, 5000);
        }
        
        protected EntityManagerFactory getEMF(String name) {

Added: 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/AbstractQuiesceJPATest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/AbstractQuiesceJPATest.java?rev=1629842&view=auto
==============================================================================
--- 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/AbstractQuiesceJPATest.java
 (added)
+++ 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/AbstractQuiesceJPATest.java
 Tue Oct  7 09:44:49 2014
@@ -0,0 +1,182 @@
+/*  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.aries.jpa.quiesce.itest;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.ops4j.pax.exam.CoreOptions.options;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.sql.DataSource;
+import javax.transaction.UserTransaction;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.aries.jpa.itest.AbstractJPAItest;
+import org.apache.aries.quiesce.manager.QuiesceCallback;
+import org.apache.aries.quiesce.participant.QuiesceParticipant;
+import org.junit.After;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+@ExamReactorStrategy(PerClass.class)
+public abstract class AbstractQuiesceJPATest extends AbstractJPAItest {
+    protected static final int WAIT_TIME = 200;
+    protected static final String JPA_CONTAINER = 
"org.apache.aries.jpa.container";
+    protected static final String JPA_CONTEXT = 
"org.apache.aries.jpa.container.context";
+    protected static final String TEST_BUNDLE = 
"org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle";
+    
+    protected static Logger LOG = 
LoggerFactory.getLogger(AbstractQuiesceJPATest.class);
+
+    @Inject
+    UserTransaction tm;
+
+    //This is load bearing. we have to wait to create the EntityManager until 
the DataSource is available
+    @Inject
+    DataSource ds;
+    
+
+    @Configuration
+    public Option[] configuration() {
+        return options(
+                baseOptions(),
+                ariesJpa(),
+                openJpa(),
+                testDs(),
+                testBundle()
+                );
+    }
+
+    @After
+    public void restartTestBundles() throws BundleException {
+        restartTestBundle();
+        restartBundle(JPA_CONTAINER);
+        restartBundle(JPA_CONTEXT);
+        try {
+            tm.rollback();
+        } catch (Exception e) {
+            // Ignore
+        }
+    }
+
+    protected List<Bundle> getListForTestBundle() {
+        return Collections.singletonList(
+                context().getBundleByName(TEST_BUNDLE));
+    }
+
+    protected void assertFinished(TestQuiesceCallback callback) {
+        assertTrue("Quiesce not finished", callback.bundleClearedUp());
+    }
+
+    protected void assertNotFinished(TestQuiesceCallback... callbacks)
+            throws InterruptedException {
+        Thread.sleep(WAIT_TIME);
+        for (TestQuiesceCallback callback : callbacks) {
+            assertFalse("Quiesce finished ", callback.bundleClearedUp());
+        }
+    }
+
+    protected void assertNoEMFForTestUnit() throws InvalidSyntaxException {
+        assertNull("No unit should exist", getEMFRefs(TEST_UNIT));
+    }
+
+    protected void assertNoProxyEMFForTestUnit() throws InvalidSyntaxException 
{
+        assertNull("No context should exist", getProxyEMFRefs(TEST_UNIT));
+    }
+
+    protected TestQuiesceCallback quiesce(String participantName, String 
bundleName) throws InvalidSyntaxException {
+        QuiesceParticipant participant = getParticipant(participantName);
+        TestQuiesceCallback callback = new TestQuiesceCallback();
+        participant.quiesce(callback, 
Collections.singletonList(context().getBundleByName(bundleName)));
+        return callback;
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    protected QuiesceParticipant getParticipant(String bundleName) throws 
InvalidSyntaxException {
+        ServiceReference[] refs = 
bundleContext.getServiceReferences(QuiesceParticipant.class.getName(), null);
+
+        if(refs != null) {
+            for(ServiceReference ref : refs) {
+                if(ref.getBundle().getSymbolicName().equals(bundleName))
+                    return (QuiesceParticipant) bundleContext.getService(ref);
+            }
+        }
+
+
+        return null;
+    }
+
+    protected void restartTestBundle() throws BundleException {
+        restartBundle(TEST_BUNDLE_NAME);
+    }
+
+    protected void restartBundle(String bundleName) throws BundleException {
+        Bundle b = context().getBundleByName(bundleName);
+        b.stop();
+        b.start();
+    }
+
+    protected class TestQuiesceCallback implements QuiesceCallback{
+        protected int calls = 0;
+
+        public void bundleQuiesced(Bundle... bundles) {
+            for (Bundle bundle : bundles) {
+                LOG.info("Bundle quiesced " + bundle.getSymbolicName());
+            }
+            calls++;
+        }
+
+        public boolean bundleClearedUp() {
+            return calls == 1;
+        }
+    }
+
+    protected class MultiQuiesceCallback extends TestQuiesceCallback 
implements QuiesceCallback{
+        private boolean contextFirst = true;
+
+        public void bundleQuiesced(Bundle... bundles) {
+            if (++calls == 1) {
+                try {
+                    getEMF(TEST_UNIT);
+                } catch (Throwable t){
+                    contextFirst = false;
+                    if(t instanceof RuntimeException)
+                        throw (RuntimeException) t;
+                    else if (t instanceof Error)
+                        throw (Error) t;
+                    else
+                        throw new RuntimeException(t);
+                }
+            }
+        }
+
+        public boolean bundleClearedUp()
+        {
+            return calls == 2 && contextFirst;
+        }
+    }
+
+}

Added: 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPAInteractionTest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPAInteractionTest.java?rev=1629842&view=auto
==============================================================================
--- 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPAInteractionTest.java
 (added)
+++ 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPAInteractionTest.java
 Tue Oct  7 09:44:49 2014
@@ -0,0 +1,93 @@
+/*  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.aries.jpa.quiesce.itest;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.junit.Test;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerClass;
+
+@ExamReactorStrategy(PerClass.class)
+public class QuiesceJPAInteractionTest extends AbstractQuiesceJPATest {
+    
+    /**
+     * TODO This test does not work together with the QuiesceJPATest tests.
+     * This might point to an error in the code
+     */
+       @Test
+       public void testComplexQuiesceInteraction() throws Exception {
+               registerClient(TEST_UNIT);
+
+               EntityManagerFactory emf = getProxyEMF(TEST_UNIT);
+               tm.begin();
+               emf.createEntityManager().getProperties();
+
+               //Quiesce the Unit, nothing should happen
+               TestQuiesceCallback unitCallback = quiesce(JPA_CONTAINER, 
TEST_BUNDLE);
+               assertNotFinished(unitCallback);
+               getProxyEMF(TEST_UNIT);
+
+               //Quiesce the context, still nothing
+               TestQuiesceCallback contextCallback = quiesce(JPA_CONTEXT, 
TEST_BUNDLE);
+               assertNotFinished(unitCallback, contextCallback);
+               getProxyEMF(TEST_UNIT);
+
+               //Keep the unit alive
+               emf = getEMF(TEST_UNIT);
+
+               EntityManager em = emf.createEntityManager();
+               LOG.info("After commit quiesce should happen");
+               tm.commit();
+               
+               assertFinished(contextCallback);
+               assertNoProxyEMFForTestUnit();
+               getEMF(TEST_UNIT);
+               em.close();
+
+               assertFinished(unitCallback);
+               assertNoEMFForTestUnit();
+       }
+
+       @Test
+       public void testComplexQuiesceInteraction2() throws Exception {
+               registerClient(TEST_UNIT);
+
+               EntityManagerFactory emf = getProxyEMF(TEST_UNIT);
+               tm.begin();
+               emf.createEntityManager().getProperties();
+
+               MultiQuiesceCallback callback = new MultiQuiesceCallback();
+
+               // Quiesce the Unit, nothing should happen
+               getParticipant(JPA_CONTAINER).quiesce(callback, 
getListForTestBundle());
+               assertNotFinished(callback);
+
+               // Quiesce the context, still nothing
+               getParticipant(JPA_CONTEXT).quiesce(callback, 
getListForTestBundle());
+               assertNotFinished(callback);
+
+               getProxyEMF(TEST_UNIT);
+               getEMF(TEST_UNIT);
+
+               tm.commit();
+
+               assertFinished(callback);
+               assertNoEMFForTestUnit();
+       }
+
+}

Modified: 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java?rev=1629842&r1=1629841&r2=1629842&view=diff
==============================================================================
--- 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java
 (original)
+++ 
aries/trunk/jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/quiesce/itest/QuiesceJPATest.java
 Tue Oct  7 09:44:49 2014
@@ -15,114 +15,28 @@
  */
 package org.apache.aries.jpa.quiesce.itest;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.ops4j.pax.exam.CoreOptions.options;
-
-import java.util.Collections;
-
-import javax.inject.Inject;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
-import javax.sql.DataSource;
-import javax.transaction.UserTransaction;
 
-import org.apache.aries.jpa.itest.AbstractJPAItest;
-import org.apache.aries.quiesce.manager.QuiesceCallback;
-import org.apache.aries.quiesce.participant.QuiesceParticipant;
-import org.junit.After;
 import org.junit.Test;
-import org.ops4j.pax.exam.Configuration;
-import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
-import org.ops4j.pax.exam.spi.reactors.PerMethod;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-
-@ExamReactorStrategy(PerMethod.class)
-public class QuiesceJPATest extends AbstractJPAItest {
-       private static final int WAIT_TIME = 200;
-       private static final String JPA_CONTAINER = 
"org.apache.aries.jpa.container";
-       private static final String JPA_CONTEXT = 
"org.apache.aries.jpa.container.context";
-       private final String TEST_BUNDLE = 
"org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle";
-
-       @Inject
-       UserTransaction tm;
-
-       //This is load bearing. we have to wait to create the EntityManager 
until the DataSource is available
-       @Inject
-       DataSource ds;
-
-       private class TestQuiesceCallback implements QuiesceCallback{
-
-               protected int calls = 0;
-
-               public void bundleQuiesced(Bundle... arg0) {
-                       calls++;
-               }
-
-               public boolean bundleClearedUp()
-               {
-                       return calls == 1;
-               }
-       }
-
-       private class MultiQuiesceCallback extends TestQuiesceCallback 
implements QuiesceCallback{
-
-               private boolean contextFirst = true;
-
-               public void bundleQuiesced(Bundle... arg0) {
-                       if(++calls == 1)
-                               try {
-                                       getEMF(TEST_UNIT);
-                               } catch (Throwable t){
-                                       contextFirst = false;
-                                       if(t instanceof RuntimeException)
-                                               throw (RuntimeException) t;
-                                       else if (t instanceof Error)
-                                               throw (Error) t;
-                                       else
-                                               throw new RuntimeException(t);
-                               }
-
-               }
-
-               public boolean bundleClearedUp()
-               {
-                       return calls == 2 && contextFirst;
-               }
-       }
-
-
-       @After
-       public void restartTestBundles() throws BundleException {
-               restartTestBundle();
-               restartBundle(JPA_CONTAINER);
-               restartBundle(JPA_CONTEXT);
-               try {
-                       tm.rollback();
-               } catch (Exception e) {
-                       // Ignore
-               }
-       }
+import org.ops4j.pax.exam.spi.reactors.PerClass;
 
+@ExamReactorStrategy(PerClass.class)
+public class QuiesceJPATest extends AbstractQuiesceJPATest {
        @Test
        public void testSimpleContextQuiesce() throws Exception {
                registerClient(TEST_UNIT);
                getProxyEMF(TEST_UNIT);
 
-               //Quiesce it
-               TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTEXT, 
TEST_BUNDLE);
+               // Quiesce should work
+               TestQuiesceCallback callback = quiesce(JPA_CONTEXT, 
TEST_BUNDLE);
                Thread.sleep(WAIT_TIME);
                assertFinished(callback);
-
                assertNoProxyEMFForTestUnit();
 
+               // After restart emf should be there again
                restartTestBundle();
-
                getProxyEMF(TEST_UNIT);
        }
 
@@ -130,41 +44,27 @@ public class QuiesceJPATest extends Abst
        public void testComplexContextQuiesce() throws Exception {
                registerClient(TEST_UNIT);
 
-               EntityManagerFactory emf = getProxyEMF(TEST_UNIT);
-               tm.begin();
-               emf.createEntityManager().getProperties();
-
-               TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTEXT, 
TEST_BUNDLE);
-               assertNotFinished(callback);
-
-               emf = getProxyEMF(TEST_UNIT);
-               tm.commit();
-               assertTrue("Quiesce not finished", callback.bundleClearedUp());
-               assertNoProxyEMFForTestUnit();
+        testQuiesceContext();
 
                restartTestBundle();
 
-               emf = getProxyEMF(TEST_UNIT);
-               tm.begin();
-               emf.createEntityManager().getProperties();
-               tm.commit();
-
-               Thread.sleep(WAIT_TIME);
-
                //Test again to make sure we don't hold state over
-               emf = getProxyEMF(TEST_UNIT);
+               testQuiesceContext();
+       }
+
+    private void testQuiesceContext() throws Exception {
+        EntityManagerFactory emf = getProxyEMF(TEST_UNIT);
                tm.begin();
                emf.createEntityManager().getProperties();
 
-               callback = getQuiesceCallback(JPA_CONTEXT, TEST_BUNDLE);
+               TestQuiesceCallback callback = quiesce(JPA_CONTEXT, 
TEST_BUNDLE);
                assertNotFinished(callback);
 
-               emf = getProxyEMF(TEST_UNIT);
+               getProxyEMF(TEST_UNIT);
                tm.commit();
-
                assertFinished(callback);
                assertNoProxyEMFForTestUnit();
-       }
+    }
 
        @Test
        public void testContextRuntimeQuiesce() throws Exception {
@@ -174,7 +74,7 @@ public class QuiesceJPATest extends Abst
                tm.begin();
                emf.createEntityManager().getProperties();
 
-               TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTEXT, 
JPA_CONTEXT);
+               TestQuiesceCallback callback = quiesce(JPA_CONTEXT, 
JPA_CONTEXT);
                assertNotFinished(callback);
 
                emf = getProxyEMF(TEST_UNIT);
@@ -186,35 +86,34 @@ public class QuiesceJPATest extends Abst
 
        @Test
        public void testSimpleUnitQuiesce() throws Exception {
-               assertEMFForTestUnit();
+               getEMF(TEST_UNIT);
 
-               TestQuiesceCallback callback = 
getQuiesceCallback(JPA_CONTAINER, TEST_BUNDLE);
+               TestQuiesceCallback callback = quiesce(JPA_CONTAINER, 
TEST_BUNDLE);
                Thread.sleep(WAIT_TIME);
                assertFinished(callback);
                assertNoEMFForTestUnit();
 
                restartTestBundle();
 
-               assertEMFForTestUnit();
+               getEMF(TEST_UNIT);
        }
 
        
        @Test
        public void testComplexUnitQuiesce() throws Exception {
-               quiesceUnit();
+               testQuiesceUnit();
                restartTestBundle();
-           getEMF(TEST_UNIT).createEntityManager().close();
                //Test a second time to make sure state isn't held
-               quiesceUnit();
+               testQuiesceUnit();
        }
        
-       private void quiesceUnit() throws Exception {
+       private void testQuiesceUnit() throws Exception {
                EntityManager em = getEMF(TEST_UNIT).createEntityManager();
 
-               TestQuiesceCallback callback = 
getQuiesceCallback(JPA_CONTAINER, TEST_BUNDLE);
+               TestQuiesceCallback callback = quiesce(JPA_CONTAINER, 
TEST_BUNDLE);
                assertNotFinished(callback);
 
-               assertEMFForTestUnit();
+               getEMF(TEST_UNIT);
                em.close();
                assertFinished(callback);
                assertNoEMFForTestUnit();
@@ -225,146 +124,13 @@ public class QuiesceJPATest extends Abst
                EntityManagerFactory emf = getEMF(TEST_UNIT);
                EntityManager em = emf.createEntityManager();
 
-               TestQuiesceCallback callback = 
getQuiesceCallback(JPA_CONTAINER, JPA_CONTAINER);
+               TestQuiesceCallback callback = quiesce(JPA_CONTAINER, 
JPA_CONTAINER);
                assertNotFinished(callback);
 
-               assertEMFForTestUnit();
-               em.close();
-               assertFinished(callback);
-               assertNoEMFForTestUnit();
-       }
-
-       @Test
-       public void testComplexQuiesceInteraction() throws Exception {
-               registerClient(TEST_UNIT);
-
-               EntityManagerFactory emf = getProxyEMF(TEST_UNIT);
-               tm.begin();
-               emf.createEntityManager().getProperties();
-
-               //Quiesce the Unit, nothing should happen
-               TestQuiesceCallback unitCallback = 
getQuiesceCallback(JPA_CONTAINER, TEST_BUNDLE);
-               assertNotFinished(unitCallback);
-
-               emf = getProxyEMF(TEST_UNIT);
-
-               //Quiesce the context, still nothing
-               TestQuiesceCallback contextCallback = 
getQuiesceCallback(JPA_CONTEXT, TEST_BUNDLE);
-               assertNotFinished(unitCallback, contextCallback);
-
-               emf = getProxyEMF(TEST_UNIT);
-
-               //Keep the unit alive
-               emf = getEMF(TEST_UNIT);
-
-               EntityManager em = emf.createEntityManager();
-               tm.commit();
-               assertFinished(contextCallback);
-               assertNoProxyEMFForTestUnit();
-               assertEMFForTestUnit();
+               getEMF(TEST_UNIT);
                em.close();
-
-               assertFinished(unitCallback);
-               assertNoEMFForTestUnit();
-       }
-
-       @Test
-       public void testComplexQuiesceInteraction2() throws Exception {
-               registerClient(TEST_UNIT);
-
-               EntityManagerFactory emf = getProxyEMF(TEST_UNIT);
-
-               tm.begin();
-
-               emf.createEntityManager().getProperties();
-
-               MultiQuiesceCallback callback = new MultiQuiesceCallback();
-
-               //Quiesce the Unit, nothing should happen
-               QuiesceParticipant participant = getParticipant(JPA_CONTAINER);
-               participant.quiesce(callback, 
Collections.singletonList(context().getBundleByName(
-                               TEST_BUNDLE)));
-
-               //Quiesce the context, still nothing
-               participant = getParticipant(JPA_CONTEXT);
-               participant.quiesce(callback, Collections.singletonList(
-                               context().getBundleByName(TEST_BUNDLE)));
-               assertNotFinished(callback);
-
-               emf = getProxyEMF(TEST_UNIT);
-               assertEMFForTestUnit();
-
-               tm.commit();
-
                assertFinished(callback);
                assertNoEMFForTestUnit();
        }
 
-       private void assertFinished(TestQuiesceCallback callback) {
-               assertTrue("Quiesce not finished", callback.bundleClearedUp());
-       }
-
-       private void assertNotFinished(TestQuiesceCallback... callbacks)
-                       throws InterruptedException {
-               Thread.sleep(WAIT_TIME);
-               for (TestQuiesceCallback callback : callbacks) {
-                       assertFalse("Quiesce finished", 
callback.bundleClearedUp());
-               }
-       }
-
-       private void assertNoEMFForTestUnit() throws InvalidSyntaxException {
-               assertNull("No unit should exist", getEMFRefs(TEST_UNIT));
-       }
-
-       private void assertEMFForTestUnit() {
-               getEMF(TEST_UNIT);
-       }
-
-       private void assertNoProxyEMFForTestUnit() throws 
InvalidSyntaxException {
-               assertNull("No context should exist", 
getProxyEMFRefs(TEST_UNIT));
-       }
-
-       private TestQuiesceCallback getQuiesceCallback(String participantName, 
String bundleName) throws InvalidSyntaxException {
-               QuiesceParticipant participant = 
getParticipant(participantName);
-               TestQuiesceCallback callback = new TestQuiesceCallback();
-               participant.quiesce(callback, 
Collections.singletonList(context().getBundleByName(bundleName)));
-               return callback;
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       private QuiesceParticipant getParticipant(String bundleName) throws 
InvalidSyntaxException {
-               ServiceReference[] refs = 
bundleContext.getServiceReferences(QuiesceParticipant.class.getName(), null);
-
-               if(refs != null) {
-                       for(ServiceReference ref : refs) {
-                               
if(ref.getBundle().getSymbolicName().equals(bundleName))
-                                       return (QuiesceParticipant) 
bundleContext.getService(ref);
-                       }
-               }
-
-
-               return null;
-       }
-
-       private void restartTestBundle() throws BundleException {
-               restartBundle(TEST_BUNDLE_NAME);
-       }
-
-       private void restartBundle(String bundleName) throws BundleException {
-               Bundle b = context().getBundleByName(bundleName);
-               b.stop();
-               b.start();
-       }
-
-       @Configuration
-       public Option[] configuration() {
-               return options(
-                               baseOptions(),
-                               ariesJpa(),
-                               openJpa(),
-                               testDs(),
-                               testBundle()
-                               );
-       }
-
 }


Reply via email to