You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2014/06/12 10:13:07 UTC
svn commit: r1602089 [2/2] - in /aries/trunk: ./ jpa/jpa-blueprint-aries/
jpa/jpa-blueprint-testbundle/ jpa/jpa-container-advancedtestbundle/
jpa/jpa-container-itest/
jpa/jpa-container-itest/src/test/java/org/apache/aries/jpa/advanced/features/itest/
j...
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=1602089&r1=1602088&r2=1602089&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 Thu Jun 12 08:13:07 2014
@@ -18,641 +18,353 @@ package org.apache.aries.jpa.quiesce.ite
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.equinox;
-import org.ops4j.pax.exam.container.def.PaxRunnerOptions;
-
-import static org.apache.aries.itest.ExtraOptions.*;
+import static org.ops4j.pax.exam.CoreOptions.options;
import java.util.Collections;
-import java.util.HashMap;
+import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
-import javax.persistence.PersistenceContextType;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
-import org.apache.aries.itest.AbstractIntegrationTest;
-import org.apache.aries.jpa.container.PersistenceUnitConstants;
-import org.apache.aries.jpa.container.context.PersistenceContextProvider;
+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.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+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;
-@RunWith(JUnit4TestRunner.class)
-public class QuiesceJPATest extends AbstractIntegrationTest {
-
- private static class TestQuiesceCallback implements QuiesceCallback{
-
- private int calls = 0;
-
- public void bundleQuiesced(Bundle... arg0) {
- calls++;
- }
-
- public boolean bundleClearedUp()
- {
- return calls == 1;
- }
- }
-
- private class MultiQuiesceCallback implements QuiesceCallback{
-
- private int calls = 0;
-
- private boolean contextFirst = true;
-
- public void bundleQuiesced(Bundle... arg0) {
- if(++calls == 1)
- try {
- context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
- } 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 {
- Bundle b = context().getBundleByName("org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle");
- b.stop();
- b.start();
-
- b = context().getBundleByName("org.apache.aries.jpa.container");
- b.stop();
- b.start();
-
- b = context().getBundleByName("org.apache.aries.jpa.container.context");
- b.stop();
- b.start();
- }
-
- @Test
- public void testSimpleContextQuiesce() throws Exception {
-
- //Get a managed context registered
- PersistenceContextProvider provider = context().getService(PersistenceContextProvider.class);
-
- HashMap<String, Object> props = new HashMap<String, Object>();
- props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
- provider.registerContext("test-unit", bundleContext.getBundle(), props);
-
- context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
-
- //Quiesce it
- QuiesceParticipant participant = getParticipant("org.apache.aries.jpa.container.context");
-
- TestQuiesceCallback callback = new TestQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- ServiceReference[] refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- assertNull("No context should exist",refs);
-
- //Restart the bundle to check the context gets re-registered
- Bundle b = context().getBundleByName("org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle");
- b.stop();
- b.start();
-
- context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
- }
-
- @Test
- public void testComplexContextQuiesce() throws Exception {
- //This is load bearing. we have to wait to create the EntityManager until the DataSource is available
- context().getService(DataSource.class);
-
- // Get a managed context registered
- PersistenceContextProvider provider = context().getService(PersistenceContextProvider.class);
-
- HashMap<String, Object> props = new HashMap<String, Object>();
- props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
- provider.registerContext("test-unit", bundleContext.getBundle(), props);
-
- EntityManagerFactory emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
-
- //Set up a transaction so we can check the Quiesce waits properly
- UserTransaction tm = context().getService(UserTransaction.class);
-
- tm.begin();
-
- emf.createEntityManager().getProperties();
-
- QuiesceParticipant participant = getParticipant("org.apache.aries.jpa.container.context");
-
- TestQuiesceCallback callback = new TestQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce finished", callback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- tm.commit();
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- ServiceReference[] refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- assertNull("No context should exist",refs);
-
-
- //Restart the bundle to check the context gets re-registered, then ensure it isn't
- //tidied up immediately again!
- Bundle b = context().getBundleByName("org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle");
- b.stop();
- b.start();
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- tm.begin();
-
- emf.createEntityManager().getProperties();
-
- tm.commit();
-
- Thread.sleep(1000);
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))", 100);
-
- //Test again to make sure we don't hold state over
-
- tm.begin();
-
- emf.createEntityManager().getProperties();
-
- callback = new TestQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce finished", callback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))", 100);
-
- tm.commit();
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- assertNull("No context should exist",refs);
-
- }
-
- @Test
- public void testContextRuntimeQuiesce() throws Exception {
- //This is load bearing. we have to wait to create the EntityManager until the DataSource is available
- context().getService(DataSource.class);
-
- PersistenceContextProvider provider = context().getService(PersistenceContextProvider.class);
-
- HashMap<String, Object> props = new HashMap<String, Object>();
- props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
- provider.registerContext("test-unit", bundleContext.getBundle(), props);
-
- EntityManagerFactory emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
-
- UserTransaction tm = context().getService(UserTransaction.class);
-
- tm.begin();
-
- emf.createEntityManager().getProperties();
-
- QuiesceParticipant participant = getParticipant("org.apache.aries.jpa.container.context");
-
- TestQuiesceCallback callback = new TestQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.container.context")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce not finished", callback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- tm.commit();
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- ServiceReference[] refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- assertNull("No context should exist",refs);
- }
-
- @Test
- public void testSimpleUnitQuiesce() throws Exception {
-
- context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- QuiesceParticipant participant = getParticipant("org.apache.aries.jpa.container");
-
- TestQuiesceCallback callback = new TestQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- ServiceReference[] refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- assertNull("No unit should exist",refs);
-
- //Restart the bundle to check the unit gets re-registered
- Bundle b = context().getBundleByName("org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle");
- b.stop();
- b.start();
-
- context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
- }
-
- @Test
- public void testComplexUnitQuiesce() throws Exception {
- //This is load bearing. we have to wait to create the EntityManager until the DataSource is available
- context().getService(DataSource.class);
-
- EntityManagerFactory emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- EntityManager em = emf.createEntityManager();
-
- QuiesceParticipant participant = getParticipant("org.apache.aries.jpa.container");
-
- TestQuiesceCallback callback = new TestQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce finished", callback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- em.close();
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- ServiceReference[] refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- assertNull("No context should exist",refs);
-
- //Restart the bundle to check the unit gets re-registered and is not immediately unregistered
- Bundle b = context().getBundleByName("org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle");
- b.stop();
- b.start();
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- em = emf.createEntityManager();
- em.close();
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))", 100);
-
- //Test a second time to make sure state isn't held
-
- em = emf.createEntityManager();
-
- callback = new TestQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce finished", callback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- em.close();
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- assertNull("No context should exist",refs);
- }
-
- @Test
- public void testContainerRuntimeQuiesce() throws Exception {
- //This is load bearing. we have to wait to create the EntityManager until the DataSource is available
- context().getService(DataSource.class);
-
- EntityManagerFactory emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
-
- EntityManager em = emf.createEntityManager();
-
- QuiesceParticipant participant = getParticipant("org.apache.aries.jpa.container");
-
- TestQuiesceCallback callback = new TestQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.container")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce finished early", callback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- em.close();
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- ServiceReference[] refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- assertNull("No context should exist",refs);
- }
-
- @Test
- public void testComplexQuiesceInteraction() throws Exception {
-
- //This is load bearing. we have to wait to create the EntityManager until the DataSource is available
- context().getService(DataSource.class);
-
- // Get a managed context registered
- PersistenceContextProvider provider = context().getService(PersistenceContextProvider.class);
-
- HashMap<String, Object> props = new HashMap<String, Object>();
- props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
- provider.registerContext("test-unit", bundleContext.getBundle(), props);
-
- EntityManagerFactory emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
-
- //Set up a transaction so we can check the Quiesce waits properly
- UserTransaction tm = context().getService(UserTransaction.class);
-
- tm.begin();
-
- emf.createEntityManager().getProperties();
-
- //Quiesce the Unit, nothing should happen
- QuiesceParticipant participant = getParticipant("org.apache.aries.jpa.container");
-
- TestQuiesceCallback unitCallback = new TestQuiesceCallback();
-
- participant.quiesce(unitCallback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce finished", unitCallback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
-
- //Quiesce the context, still nothing
-
- participant = getParticipant("org.apache.aries.jpa.container.context");
-
- TestQuiesceCallback contextCallback = new TestQuiesceCallback();
-
- participant.quiesce(contextCallback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce finished", unitCallback.bundleClearedUp());
- assertFalse("Quiesce finished", contextCallback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- //Keep the unit alive
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
-
- EntityManager em = emf.createEntityManager();
-
- tm.commit();
-
- assertTrue("Quiesce not finished", contextCallback.bundleClearedUp());
-
- ServiceReference[] refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- assertNull("No context should exist",refs);
-
- //Still a unit
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- em.close();
-
- assertTrue("Quiesce not finished", unitCallback.bundleClearedUp());
-
- refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- assertNull("No unit should exist",refs);
- }
-
- @Test
- public void testComplexQuiesceInteraction2() throws Exception {
- //This is load bearing. we have to wait to create the EntityManager until the DataSource is available
- context().getService(DataSource.class);
-
- // Get a managed context registered
- PersistenceContextProvider provider = context().getService(PersistenceContextProvider.class);
-
- HashMap<String, Object> props = new HashMap<String, Object>();
- props.put(PersistenceContextProvider.PERSISTENCE_CONTEXT_TYPE, PersistenceContextType.TRANSACTION);
- provider.registerContext("test-unit", bundleContext.getBundle(), props);
-
- EntityManagerFactory emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
-
- //Set up a transaction so we can check the Quiesce waits properly
- UserTransaction tm = context().getService(UserTransaction.class);
-
- tm.begin();
-
- emf.createEntityManager().getProperties();
-
- //Quiesce the Unit, nothing should happen
- QuiesceParticipant participant = getParticipant("org.apache.aries.jpa.container");
-
- MultiQuiesceCallback callback = new MultiQuiesceCallback();
-
- participant.quiesce(callback, Collections.singletonList(context().getBundleByName(
- "org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- //Quiesce the context, still nothing
- participant = getParticipant("org.apache.aries.jpa.container.context");
-
- participant.quiesce(callback, Collections.singletonList(
- context().getBundleByName("org.apache.aries.jpa.org.apache.aries.jpa.container.itest.bundle")));
-
- Thread.sleep(1000);
-
- assertFalse("Quiesce finished", callback.bundleClearedUp());
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true)" +
- "(" + PersistenceContextProvider.PROXY_FACTORY_EMF_ATTRIBUTE + "=*))");
-
- emf = context().getService(EntityManagerFactory.class, "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
-
- tm.commit();
-
- assertTrue("Quiesce not finished", callback.bundleClearedUp());
-
- ServiceReference[] refs = bundleContext.getAllServiceReferences(EntityManagerFactory.class.getName(), "(&(osgi.unit.name=test-unit)("
- + PersistenceUnitConstants.CONTAINER_MANAGED_PERSISTENCE_UNIT + "=true))");
-
- assertNull("No context should exist",refs);
-
- }
-
-
-
- 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;
- }
-
- @org.ops4j.pax.exam.junit.Configuration
- public static Option[] configuration() {
- return testOptions(
- transactionBootDelegation(),
- paxLogging("DEBUG"),
-
- // Bundles
- mavenBundle("org.osgi", "org.osgi.compendium"),
- mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.cglib"),
- mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy.api"),
- mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy.impl"),
- mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.api"),
- mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.core"),
- mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi.url"),
- mavenBundle("org.apache.aries.transaction", "org.apache.aries.transaction.testds"),
- mavenBundle("org.apache.derby", "derby"),
- mavenBundle("org.apache.aries.quiesce", "org.apache.aries.quiesce.api"),
- mavenBundle("org.apache.aries", "org.apache.aries.util"),
- mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.api"),
- mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint.core"),
- mavenBundle("org.apache.geronimo.specs", "geronimo-jpa_2.0_spec"),
- mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.api"),
- mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container"),
- mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.context"),
- mavenBundle("org.apache.geronimo.specs", "geronimo-jta_1.1_spec"),
- mavenBundle("org.apache.aries.transaction", "org.apache.aries.transaction.manager"),
- mavenBundle("commons-lang", "commons-lang"),
- mavenBundle("commons-collections", "commons-collections"),
- mavenBundle("commons-pool", "commons-pool"),
- mavenBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.serp"),
- mavenBundle("org.apache.openjpa", "openjpa"),
-
-// mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.jpa"),
-// mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.core"),
-// mavenBundle("org.eclipse.persistence", "org.eclipse.persistence.asm"),
-
- mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.container.itest.bundle"),
-
- // Add in a workaround to get OSGi 4.3 support with the current version of pax-exam
- PaxRunnerOptions.rawPaxRunnerOption("config", "classpath:ss-runner.properties"),
- equinox().version("3.7.0.v20110613")
- );
-
- }
+@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
+ }
+ }
+
+ @Test
+ public void testSimpleContextQuiesce() throws Exception {
+ registerClient(TEST_UNIT);
+ getProxyEMF(TEST_UNIT);
+
+ //Quiesce it
+ TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTEXT, TEST_BUNDLE);
+ Thread.sleep(WAIT_TIME);
+ assertFinished(callback);
+
+ assertNoProxyEMFForTestUnit();
+
+ restartTestBundle();
+
+ getProxyEMF(TEST_UNIT);
+ }
+
+ @Test
+ 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();
+
+ 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);
+ tm.begin();
+ emf.createEntityManager().getProperties();
+
+ callback = getQuiesceCallback(JPA_CONTEXT, TEST_BUNDLE);
+ assertNotFinished(callback);
+
+ emf = getProxyEMF(TEST_UNIT);
+ tm.commit();
+
+ assertFinished(callback);
+ assertNoProxyEMFForTestUnit();
+ }
+
+ @Test
+ public void testContextRuntimeQuiesce() throws Exception {
+ registerClient(TEST_UNIT);
+
+ EntityManagerFactory emf = getProxyEMF(TEST_UNIT);
+ tm.begin();
+ emf.createEntityManager().getProperties();
+
+ TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTEXT, JPA_CONTEXT);
+ assertNotFinished(callback);
+
+ emf = getProxyEMF(TEST_UNIT);
+ tm.commit();
+
+ assertFinished(callback);
+ assertNoProxyEMFForTestUnit();
+ }
+
+ @Test
+ public void testSimpleUnitQuiesce() throws Exception {
+ assertEMFForTestUnit();
+
+ TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTAINER, TEST_BUNDLE);
+ Thread.sleep(WAIT_TIME);
+ assertFinished(callback);
+ assertNoEMFForTestUnit();
+
+ restartTestBundle();
+
+ assertEMFForTestUnit();
+ }
+
+
+ @Test
+ public void testComplexUnitQuiesce() throws Exception {
+ quiesceUnit();
+ restartTestBundle();
+ getEMF(TEST_UNIT).createEntityManager().close();
+ //Test a second time to make sure state isn't held
+ quiesceUnit();
+ }
+
+ private void quiesceUnit() throws Exception {
+ EntityManager em = getEMF(TEST_UNIT).createEntityManager();
+
+ TestQuiesceCallback callback = getQuiesceCallback(JPA_CONTAINER, TEST_BUNDLE);
+ assertNotFinished(callback);
+
+ assertEMFForTestUnit();
+ em.close();
+ assertFinished(callback);
+ assertNoEMFForTestUnit();
+ }
+
+ @Test
+ public void testContainerRuntimeQuiesce() throws Exception {
+ EntityManagerFactory emf = getEMF(TEST_UNIT);
+ EntityManager em = emf.createEntityManager();
+
+ TestQuiesceCallback callback = getQuiesceCallback(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();
+ 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()
+ );
+ }
+
}
Added: aries/trunk/jpa/jpa-container-testbundle/.gitignore
URL: http://svn.apache.org/viewvc/aries/trunk/jpa/jpa-container-testbundle/.gitignore?rev=1602089&view=auto
==============================================================================
--- aries/trunk/jpa/jpa-container-testbundle/.gitignore (added)
+++ aries/trunk/jpa/jpa-container-testbundle/.gitignore Thu Jun 12 08:13:07 2014
@@ -0,0 +1 @@
+/target