made a copy

git-svn-id: file:///svnroot/rt/org.eclipse.gemini.jpa/branches/1.0.0@194 738bc060-e27f-0410-be59-ab60bd4d2b7a
diff --git a/org.eclipse.gemini.jpa.tests/.classpath b/org.eclipse.gemini.jpa.tests/.classpath
new file mode 100644
index 0000000..335ba65
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<classpath>

+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>

+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

+	<classpathentry excluding="**/.svn/*" kind="src" path="src"/>

+	<classpathentry kind="output" path="bin"/>

+</classpath>

diff --git a/org.eclipse.gemini.jpa.tests/.project b/org.eclipse.gemini.jpa.tests/.project
new file mode 100644
index 0000000..adca819
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>

+<projectDescription>

+	<name>org.eclipse.gemini.jpa.tests</name>

+	<comment></comment>

+	<projects>

+	</projects>

+	<buildSpec>

+		<buildCommand>

+			<name>org.eclipse.jdt.core.javabuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.pde.ManifestBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.pde.SchemaBuilder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

+	</buildSpec>

+	<natures>

+		<nature>org.eclipse.pde.PluginNature</nature>

+		<nature>org.eclipse.jdt.core.javanature</nature>

+	</natures>

+</projectDescription>

diff --git a/org.eclipse.gemini.jpa.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.gemini.jpa.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..491a8ab
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Tue Jul 06 10:16:50 EDT 2010

+eclipse.preferences.version=1

+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled

+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5

+org.eclipse.jdt.core.compiler.compliance=1.5

+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error

+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error

+org.eclipse.jdt.core.compiler.source=1.5

diff --git a/org.eclipse.gemini.jpa.tests/.settings/org.eclipse.pde.core.prefs b/org.eclipse.gemini.jpa.tests/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..5b13dda
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#Wed Aug 12 10:01:56 EDT 2009

+eclipse.preferences.version=1

+pluginProject.equinox=false

+pluginProject.extensions=false

+resolve.requirebundle=false

diff --git a/org.eclipse.gemini.jpa.tests/META-INF/MANIFEST.MF b/org.eclipse.gemini.jpa.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0a9a3f4
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Gemini JPA Unit Tests
+Bundle-SymbolicName: org.eclipse.gemini.jpa.tests
+Bundle-Version: 1.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Import-Package: javax.persistence;jpa="2.0";version="1.1.0",
+ javax.persistence.metamodel;jpa="2.0";version="1.1.0",
+ org.junit;version="4.8.1",
+ org.junit.runner;version="4.8.1",
+ org.junit.runner.notification;version="4.5.0",
+ org.osgi.framework;version="1.3.0",
+ org.osgi.service.jpa;version="1.0.0",
+ org.osgi.util.tracker;version="1.3.1",
+ org.osgi.service.jdbc;version="[1.0,2.0)",
+ test;version="1.0.0",
+ model.account;version="1.0.0",
+ model.embeddedjdbc;version="1.0.0";resolution:=optional,
+ model.embeddedaccount;version="1.0.0";resolution:=optional,
+ model.xmlmapped;version="1.0.0";resolution:=optional,
+ model.weaved;version="1.0.0";resolution:=optional
+Require-Bundle: org.eclipse.persistence.core
+Bundle-Activator: org.eclipse.gemini.jpa.tests.Activator
diff --git a/org.eclipse.gemini.jpa.tests/build.properties b/org.eclipse.gemini.jpa.tests/build.properties
new file mode 100644
index 0000000..41eb6ad
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/build.properties
@@ -0,0 +1,4 @@
+source.. = src/

+output.. = bin/

+bin.includes = META-INF/,\

+               .

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/Activator.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/Activator.java
new file mode 100644
index 0000000..388e2fe
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/Activator.java
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Oracle.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and Apache License v2.0 which accompanies this distribution. 
+ * The Eclipse Public License is available at
+ *     http://www.eclipse.org/legal/epl-v10.html
+ * and the Apache License v2.0 is available at 
+ *     http://www.opensource.org/licenses/apache2.0.php.
+ * You may elect to redistribute this code under either of these licenses.
+ *
+ * Contributors:
+ *     mkeith - Gemini JPA tests 
+ ******************************************************************************/
+package org.eclipse.gemini.jpa.tests;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+
+import test.TestState;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+import javax.persistence.EntityManagerFactory;
+
+import org.osgi.service.jdbc.DataSourceFactory;
+import org.osgi.service.jpa.EntityManagerFactoryBuilder;
+
+/**
+ * Activator to start tests when relevant service becomes available
+ * 
+ * @author mkeith
+ */
+public class Activator implements BundleActivator, ServiceTrackerCustomizer {
+
+    BundleContext ctx;
+    
+    ServiceTracker emfTracker;
+    ServiceTracker emfbTracker;
+    ServiceTracker dsfTracker;
+    
+    // Map of test class to test instance
+    Map<Class<? extends JpaTest>,JpaTest> testClasses = new HashMap<Class<? extends JpaTest>,JpaTest>();    
+//    Set<JpaTest> testClassInstances = new HashSet<JpaTest>();    
+
+    public void start(BundleContext context) throws Exception {
+        log("Tests active");
+
+        ctx = context;
+        JpaTest.context = context;
+                
+        emfTracker = new ServiceTracker(ctx, EntityManagerFactory.class.getName(), this);
+        emfbTracker = new ServiceTracker(ctx, EntityManagerFactoryBuilder.class.getName(), this);
+        dsfTracker = new ServiceTracker(ctx, DataSourceFactory.class.getName(), this);
+
+        // Create the set of tests to run (get list from TestState)
+        try {
+            for (String clsString : TestState.getIncompletedTests()) {
+                // Load the class
+                Class<? extends JpaTest> testClass = (Class<? extends JpaTest>)
+                            ctx.getBundle().loadClass("org.eclipse.gemini.jpa.tests." + clsString);
+                // Create an instance of the class
+                JpaTest test = null;
+                test = testClass.newInstance(); 
+                // Store the instance against the class 
+                testClasses.put(testClass, test);
+            }
+            log("TestClasses: " + testClasses.keySet());
+        } catch (ClassNotFoundException cnfEx) {
+            log("***************** Failed trying to load test class: " + cnfEx);
+        }
+        // Run tests from tracker when service is online
+        emfTracker.open();
+        emfbTracker.open();
+        dsfTracker.open();
+    }
+
+    public void stop(BundleContext context) throws Exception {
+        log("Tests stopped");
+        emfbTracker.close();
+        emfTracker.close();
+        dsfTracker.close();
+        // Clear the queue since if we are being refreshed we may have new classes on restart
+        TestState.dsfQueuedTests.clear();
+    }
+    
+    private JpaTest testInstance(Class<? extends JpaTest> cls) {
+        return testClasses.get(cls);
+    }
+    
+    boolean shouldRun(Class<? extends JpaTest> testClass, String unitName, boolean isEMFService) {
+        JpaTest test = testClasses.get(testClass);
+        return !TestState.isTested(testClass.getSimpleName())
+               && test.getTestPersistenceUnitName().equals(unitName)
+               && (!(test.needsEmfService() ^ isEMFService));
+    }
+    
+    void runTest(Class<? extends JpaTest> testClass) {
+        String testName = testClass.getSimpleName();
+        TestState.startTest(testName);
+        log("Running " + testName + ": ");
+        Result r = JUnitCore.runClasses(testClass);
+
+        log(testName + " results: ");
+        logResultStats(r);
+        TestState.completedTest(testName,r);
+            
+        log("Done " + testName);
+
+        Set<String> incompleteTests = TestState.getIncompletedTests();
+        if (!incompleteTests.isEmpty()) {
+            System.out.println("------------------- Tests not run yet: " + incompleteTests);
+        } else {
+            // If no more tests to run, print out a summary
+            System.out.println("-----------------------------------------------------"); 
+            System.out.println("------------------- Test Summary --------------------"); 
+            System.out.println("-----------------------------------------------------"); 
+            Set<Map.Entry<String,Result>> results = TestState.getAllTestResults().entrySet();
+            for (Map.Entry<String,Result> entry : results) {
+                System.out.println("Test: " + entry.getKey()); 
+                logResultStats(entry.getValue()); 
+            }
+        }
+    }
+
+    /*========================*/
+    /* ServiceTracker methods */
+    /*========================*/
+
+    public Object addingService(ServiceReference ref) {
+        Object service = ref.getBundle().getBundleContext().getService(ref);
+
+        // Check to see if it is a DSF (and the Client driver)
+        String driverClassName = (String) ref.getProperty(DataSourceFactory.OSGI_JDBC_DRIVER_CLASS);
+        if ((driverClassName != null) && (driverClassName.equals(JpaTest.JDBC_TEST_DRIVER))) {
+            // Record in the TestState (does not risk getting refreshed) that the DSF is online
+            TestState.isDsfOnline = true;
+            log("Service added **** DataSourceFactory for " + driverClassName);
+            // Now go through the pending dsf queue and run the tests
+            log("**** Running queued tests");
+            for (Class cls : TestState.dsfQueuedTests) {
+                runTest((Class<? extends JpaTest>)cls);
+            }
+            log("**** Finished running queued tests");
+            TestState.dsfQueuedTests.clear();
+        } else {
+            // Check if it is JPA service (EMF or EMFB)
+            String unitName = (String)ref.getProperty(EntityManagerFactoryBuilder.JPA_UNIT_NAME);
+            if (unitName != null) {
+                // We have a JPA service. Is it an EMF or an EMFBuilder?
+                boolean isEmfService = EntityManagerFactory.class.isInstance(service);                
+                log("Service added **** name=" + unitName + " EMF" + (isEmfService ? "" : "Builder"));
+
+                // Now ask each test if it should run based on the punit name and whether 
+                // the service is an EMF or an EMFBuilder. Note that more than one test 
+                // may run on the same EMF/B service.
+                for (Class<? extends JpaTest> cls : testClasses.keySet()) {
+                    
+                    // See if the test would run (ignoring whether DSF is online)
+                    if (shouldRun(cls, unitName, isEmfService)) {
+                        
+                        // If the test needs the DSF service but the service is not online  
+                        // then put the test in the pending DSF queue.
+                        if (testInstance(cls).needsDsfService() && !TestState.isDsfOnline) {
+                            TestState.dsfQueuedTests.add(cls);
+                        } else {
+                            // We are good to go
+                            runTest(cls);
+                        }
+                    }
+                }
+            }
+        }
+        return service;
+    }
+
+    public void modifiedService(ServiceReference ref, Object service) {}
+
+    public void removedService(ServiceReference ref, Object service) {}
+
+    /*================*/
+    /* Helper methods */
+    /*================*/
+
+    void logResultStats(Result r) {
+        log("Result: " + 
+                " runs=" + r.getRunCount() + 
+                " failures=" + r.getFailureCount() +
+                " ignore=" + r.getIgnoreCount());        
+        log("Failures: " + r.getFailures());
+        for (Failure f : r.getFailures())
+            log("--- Failure: \n" + f.getTrace());
+    }
+    
+    static void log(String msg) {
+        System.out.println("===== " + msg);
+    }    
+}
diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/JpaTest.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/JpaTest.java
new file mode 100644
index 0000000..65d3af1
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/JpaTest.java
@@ -0,0 +1,182 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.util.HashMap;

+import java.util.List;

+import java.util.Map;

+import java.util.Set;

+

+import javax.persistence.*;

+import javax.persistence.metamodel.EntityType;

+

+import org.junit.*;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.InvalidSyntaxException;

+import org.osgi.framework.ServiceReference;

+import org.osgi.service.jpa.EntityManagerFactoryBuilder;

+

+import model.account.*;

+

+/**

+ * Test class to test EMF Service from a client

+ * 

+ * @author mkeith

+ */

+public abstract class JpaTest {

+    

+    public static BundleContext context;

+

+    // Define the JDBC access details. At some point we should probably externalize this...

+    public static final String JDBC_TEST_DRIVER = "org.apache.derby.jdbc.ClientDriver";

+    public static final String JDBC_TEST_URL = "jdbc:derby://localhost:1527/accountDB;create=true";

+    public static final String JDBC_TEST_USER = "app";

+    public static final String JDBC_TEST_PASSWORD = "app";

+

+    // Put the JDBC access config in the default props

+    public static Map<String,Object> defaultProps() {

+        Map<String,Object> props = new HashMap<String,Object>();        

+        props.put("javax.persistence.jdbc.driver", JDBC_TEST_DRIVER);

+        props.put("javax.persistence.jdbc.url", JDBC_TEST_URL);

+        props.put("javax.persistence.jdbc.user", JDBC_TEST_USER);

+        props.put("javax.persistence.jdbc.password", JDBC_TEST_URL);

+        return props;

+    }

+

+    /* === Methods that *must* be subclassed === */

+

+    public abstract EntityManagerFactory getEmf();

+

+    public abstract String getTestPersistenceUnitName();

+    

+    /* === Methods that *may* be subclassed === */

+

+    public boolean needsEmfService() { return true; }

+

+    public boolean needsDsfService() { return true; }

+

+    public String testName() {

+        return this.getClass().getSimpleName();

+    }

+

+    public Object newObject() {

+        Account a = new Account();

+        a.setBalance(100.0);

+        return a;

+    }

+    

+    public Object findObject() {

+        EntityManager em = getEmf().createEntityManager();

+        Object obj = em.find(Account.class, 1);

+        em.close();

+        return obj;

+    }

+

+    public Object queryObjects() {

+        EntityManager em = getEmf().createEntityManager();

+        List<?> result = em.createQuery("SELECT a FROM Account a").getResultList();

+        em.close();

+        return result;

+    }

+

+    /* === Test Methods === */

+    

+    @Test

+    public void testGettingEntityManager() {

+        log("testGettingEntityManager");

+        EntityManager em = getEmf().createEntityManager();

+        log("Got EM - " + em);

+    }

+

+    @Test

+    public void testPersisting() {

+        log("testPersisting");

+        EntityManager em = getEmf().createEntityManager();

+        Object obj = newObject();

+        em.getTransaction().begin();

+        log("testPersisting - tx begun");

+        try {

+            em.persist(obj);

+        } catch (Exception e) {

+            log("Error calling persist(): ");

+            e.printStackTrace(System.out);

+        }

+        log("testPersisting - tx committing");

+        em.getTransaction().commit();

+        em.close();

+        log("Persisted " + obj);

+    }

+    

+    @Test

+    public void testFinding() {

+        log("testFinding");

+        log("Find returned - " + findObject());

+    }

+

+    @Test

+    public void testQuerying() {

+        log("testQuerying");

+        log("Query returned - " + queryObjects());

+    }

+

+    @Test

+    public void testGettingMetamodel() {

+        log("testGettingMetamodel");

+        EntityManager em = getEmf().createEntityManager();

+        Set<EntityType<?>> s = em.getMetamodel().getEntities();

+        for (EntityType<?> et : s) {

+            log("Managed Entity name: " + et.getName());

+            log("Managed Entity class: " + et.getJavaType());

+            log("Classloader: " + et.getJavaType().getClassLoader());

+        }

+    }

+    

+    /* === Helper methods === */

+

+    public static EntityManagerFactory lookupEntityManagerFactory(String testName, String puName) {

+        String filter = "(osgi.unit.name="+puName+")";

+        ServiceReference[] refs = null;

+        try {

+            refs = context.getServiceReferences(EntityManagerFactory.class.getName(), filter);

+        } catch (InvalidSyntaxException isEx) {

+            new RuntimeException("Bad filter", isEx);

+        }

+        slog(testName, "EMF Service refs looked up from registry: " + refs);

+        return (refs == null)

+            ? null

+            : (EntityManagerFactory) context.getService(refs[0]);

+    }

+    

+    public static EntityManagerFactoryBuilder lookupEntityManagerFactoryBuilder(String testName, String puName) {

+        String filter = "(osgi.unit.name="+puName+")";

+        ServiceReference[] refs = null;

+        try {

+            refs = context.getServiceReferences(EntityManagerFactoryBuilder.class.getName(), filter);

+        } catch (InvalidSyntaxException isEx) {

+            new RuntimeException("Bad filter", isEx);

+        }

+        slog(testName, "EMF Builder Service refs looked up from registry: " + refs);

+        return (refs == null)

+            ? null

+            : (EntityManagerFactoryBuilder) context.getService(refs[0]);

+    }

+

+    public static void slog(String testName, String msg) {

+        System.out.println("***** " + testName + " - " + msg);

+    }    

+    public void log(String msg) {

+        System.out.println("***** " + this.getClass().getSimpleName() + " - " + msg);

+    }    

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderExternalDataSource.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderExternalDataSource.java
new file mode 100644
index 0000000..5e38d21
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderExternalDataSource.java
@@ -0,0 +1,96 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.sql.SQLException;

+import java.util.HashMap;

+import java.util.Map;

+import java.util.Properties;

+

+import javax.persistence.EntityManagerFactory;

+import javax.sql.DataSource;

+

+import org.osgi.framework.InvalidSyntaxException;

+import org.osgi.framework.ServiceReference;

+import org.osgi.service.jdbc.DataSourceFactory;

+import org.osgi.service.jpa.EntityManagerFactoryBuilder;

+

+import org.junit.*;

+

+/**

+ * Test class to test looking up EMF Builder Service from a client

+ * for a punit that does not a have data source props specified

+ * 

+ * @author mkeith

+ */

+public class TestEMFBuilderExternalDataSource extends JpaTest {

+

+    public static final String TEST_NAME = "TestEMFBuilderExternalDataSource";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "AccountsNoDataSource";

+

+    public static EntityManagerFactory emf;

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        DataSource ds = null;

+        try {

+            ServiceReference[] refs = context.getServiceReferences(

+                    DataSourceFactory.class.getName(), "(osgi.jdbc.driver.class=" + JDBC_TEST_DRIVER + ")");

+            if (refs == null) {

+                throw new RuntimeException("Failed looking up driver in registry");

+            }

+

+            DataSourceFactory dsf = (DataSourceFactory)context.getService(refs[0]);        	

+        	if (dsf == null) {

+        	    throw new RuntimeException("Failed getting svc from DSF svc ref");

+        	}

+            Properties props = new Properties();        

+            props.put(DataSourceFactory.JDBC_URL, JDBC_TEST_URL);

+            props.put(DataSourceFactory.JDBC_USER, JDBC_TEST_USER);

+            props.put(DataSourceFactory.JDBC_PASSWORD, JDBC_TEST_PASSWORD);

+            

+            ds = dsf.createDataSource(props);

+

+        } catch (InvalidSyntaxException e) {

+            e.printStackTrace();

+        } catch (SQLException e) {

+			e.printStackTrace();

+		}

+

+        Map<String,Object> props = new HashMap<String,Object>();        

+        props.put("javax.persistence.nonJtaDataSource", ds);

+        

+        emf = emfb.createEntityManagerFactory(props);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public boolean needsEmfService() { return false; }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderService.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderService.java
new file mode 100644
index 0000000..12add83
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderService.java
@@ -0,0 +1,64 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.util.HashMap;

+import java.util.Map;

+

+import javax.persistence.EntityManagerFactory;

+

+import org.osgi.service.jpa.EntityManagerFactoryBuilder;

+

+import org.junit.*;

+

+/**

+ * Test class to test looking up EMF Builder Service from a client

+ * 

+ * @author mkeith

+ */

+public class TestEMFBuilderService extends JpaTest {

+    

+    public static final String TEST_NAME = "TestEMFBuilderService";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "Accounts";

+

+    protected static EntityManagerFactory emf;

+

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        Map<String,Object> props = new HashMap<String,Object>();        

+        emf = emfb.createEntityManagerFactory(props);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public boolean needsEmfService() { return false; }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderServiceProperties.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderServiceProperties.java
new file mode 100644
index 0000000..3419a4e
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFBuilderServiceProperties.java
@@ -0,0 +1,59 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import javax.persistence.EntityManagerFactory;

+

+import org.osgi.service.jpa.EntityManagerFactoryBuilder;

+

+import org.junit.*;

+

+/**

+ * Test class to test looking up EMF Builder Service from a client

+ * for a punit that does not have data source props specified

+ * 

+ * @author mkeith

+ */

+public class TestEMFBuilderServiceProperties extends JpaTest {

+

+    public static final String TEST_NAME = "TestEMFBuilderServiceProperties";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "AccountsNoDataSource";

+

+    public static EntityManagerFactory emf;

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        emf = emfb.createEntityManagerFactory(JpaTest.defaultProps());

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public boolean needsEmfService() { return false; }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFService.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFService.java
new file mode 100644
index 0000000..0a889f0
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEMFService.java
@@ -0,0 +1,55 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import javax.persistence.EntityManagerFactory;

+

+import org.junit.*;

+

+/**

+ * Test class to test looking up EMF Service from a client

+ * 

+ * @author mkeith

+ */

+public class TestEMFService extends JpaTest {

+        

+    public static final String TEST_NAME = "TestEMFService";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "Accounts";

+

+    protected static EntityManagerFactory emf;

+

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        emf = lookupEntityManagerFactory(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+    

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmbeddedJdbc.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmbeddedJdbc.java
new file mode 100644
index 0000000..bf810e3
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmbeddedJdbc.java
@@ -0,0 +1,83 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.util.List;

+

+import javax.persistence.EntityManagerFactory;

+import javax.persistence.EntityManager;

+

+import model.embeddedjdbc.EmptyEntity;

+

+import org.junit.*;

+

+/**

+ * Test class to test persistence without using DBAccess

+ *  

+ * @author mkeith

+ */

+public class TestEmbeddedJdbc extends JpaTest {

+        

+    public static final String TEST_NAME = "TestEmbeddedJdbc";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "EmbeddedJDBC";

+

+    protected static EntityManagerFactory emf;

+    

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        emf = lookupEntityManagerFactory(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Subclassed methods === */

+    

+    public boolean needsDsfService() { return false; }

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public Object newObject() {

+        EmptyEntity a = new EmptyEntity();

+        a.setId(1);

+        a.setData("data");

+        return a;

+    }

+

+    public Object findObject() {

+        EntityManager em = emf.createEntityManager();

+        Object obj = em.find(EmptyEntity.class, 1);

+        em.close();

+        return obj;

+    }

+

+    public Object queryObjects() {

+        EntityManager em = emf.createEntityManager();

+        List<?> result = em.createQuery("SELECT a FROM EmptyEntity a").getResultList();

+        em.close();

+        return result;

+    }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmbeddedPUnit.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmbeddedPUnit.java
new file mode 100644
index 0000000..86d61b1
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmbeddedPUnit.java
@@ -0,0 +1,80 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.util.List;

+

+import javax.persistence.EntityManagerFactory;

+import javax.persistence.EntityManager;

+

+import model.embeddedaccount.EmbAccount;

+

+import org.junit.*;

+

+/**

+ * Test class to test looking up EMF Service of an embedded persistence unit

+ * 

+ * @author mkeith

+ */

+public class TestEmbeddedPUnit extends JpaTest {

+        

+    public static final String TEST_NAME = "TestEmbeddedPUnit";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "EmbeddedAccounts";

+

+    protected static EntityManagerFactory emf;

+    

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        emf = lookupEntityManagerFactory(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public Object newObject() {

+        EmbAccount a = new EmbAccount();

+        a.setBalance(100.0);

+        return a;

+    }

+    

+    public Object findObject() {

+        EntityManager em = emf.createEntityManager();

+        Object obj = em.find(EmbAccount.class, 1);

+        em.close();

+        return obj;

+    }

+

+    public Object queryObjects() {

+        EntityManager em = emf.createEntityManager();

+        List<?> result = em.createQuery("SELECT a FROM EmbAccount a").getResultList();

+        em.close();

+        return result;

+    }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmptyPersistence.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmptyPersistence.java
new file mode 100644
index 0000000..f3c0e66
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmptyPersistence.java
@@ -0,0 +1,71 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import javax.persistence.EntityManagerFactory;

+

+import org.junit.*;

+import org.osgi.service.jpa.EntityManagerFactoryBuilder;

+

+/**

+ * Test class to test empty persistence unit using OSGi JPA services

+ * 

+ * @author mkeith

+ */

+public class TestEmptyPersistence extends JpaTest {

+    

+    public static final String TEST_NAME = "TestEmptyPersistenceUnit";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "Empty1";

+

+    public static EntityManagerFactory emf;

+

+    public static boolean shouldRun(String unitName, boolean isEMF) {

+        return PERSISTENCE_UNIT_UNDER_TEST.equals(unitName) && !isEMF;

+    }

+    

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        emf = emfb.createEntityManagerFactory(JpaTest.defaultProps());

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    public void testPersisting() {

+        log("overridden testPersisting");

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public boolean needsEmfService() { return false; }

+

+    public Object newObject() { return null; }

+    public Object findObject() { return null; }

+    public Object queryObjects() { return null; }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmptyPersistenceWithProps.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmptyPersistenceWithProps.java
new file mode 100644
index 0000000..4e0f32e
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestEmptyPersistenceWithProps.java
@@ -0,0 +1,71 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.util.HashMap;

+import java.util.Map;

+

+import javax.persistence.EntityManagerFactory;

+

+import org.junit.*;

+import org.osgi.service.jpa.EntityManagerFactoryBuilder;

+

+/**

+ * Test class to test empty persistence unit using OSGi JPA services

+ * 

+ * @author mkeith

+ */

+public class TestEmptyPersistenceWithProps extends JpaTest {

+    

+    public static final String TEST_NAME = "TestEmptyPersistenceUnitWithProps";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "Empty2";

+

+    public static EntityManagerFactory emf;

+    

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        Map<String,Object> props = new HashMap<String,Object>();        

+        emf = emfb.createEntityManagerFactory(props);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    public void testPersisting() {

+        log("overridden testPersisting");

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public boolean needsEmfService() { return false; }

+

+    public Object newObject() { return null; }

+    public Object findObject() { return null; }

+    public Object queryObjects() { return null; }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestMappingFileElement.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestMappingFileElement.java
new file mode 100644
index 0000000..d8d06f5
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestMappingFileElement.java
@@ -0,0 +1,82 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.util.List;

+

+import javax.persistence.EntityManagerFactory;

+import javax.persistence.EntityManager;

+

+import model.xmlmapped.SimpleEntity2;

+

+import org.junit.*;

+

+/**

+ * Test class for an entity mapped in orm.xml

+ * 

+ * @author mkeith

+ */

+public class TestMappingFileElement extends JpaTest {

+        

+    public static final String TEST_NAME = "TestMappingFileElement";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "XmlMapped";

+

+    protected static EntityManagerFactory emf;

+    

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        emf = lookupEntityManagerFactory(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public Object newObject() {

+        SimpleEntity2 a = new SimpleEntity2();

+        a.setId(20);

+        a.setSimpleInt(21);

+        return a;

+    }

+    

+    public Object findObject() {

+        EntityManager em = emf.createEntityManager();

+        Object obj = em.find(SimpleEntity2.class, 1);

+        em.close();

+        return obj;

+    }

+

+    public Object queryObjects() {

+        EntityManager em = emf.createEntityManager();

+        List<?> result = em.createQuery("SELECT a FROM SimpleEntity2 a").getResultList();

+        assert(result.size() == 1);

+        em.close();

+        return result;

+    }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestOrmMappingFile.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestOrmMappingFile.java
new file mode 100644
index 0000000..659ee00
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestOrmMappingFile.java
@@ -0,0 +1,82 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.util.List;

+

+import javax.persistence.EntityManagerFactory;

+import javax.persistence.EntityManager;

+

+import model.xmlmapped.SimpleEntity;

+

+import org.junit.*;

+

+/**

+ * Test class for an entity mapped in orm.xml

+ * 

+ * @author mkeith

+ */

+public class TestOrmMappingFile extends JpaTest {

+        

+    public static final String TEST_NAME = "TestOrmMappingFile";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "XmlMapped";

+

+    protected static EntityManagerFactory emf;

+    

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        emf = lookupEntityManagerFactory(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public Object newObject() {

+        SimpleEntity a = new SimpleEntity();

+        a.setId(10);

+        a.setSimpleString("11");

+        return a;

+    }

+    

+    public Object findObject() {

+        EntityManager em = emf.createEntityManager();

+        Object obj = em.find(SimpleEntity.class, 1);

+        em.close();

+        return obj;

+    }

+

+    public Object queryObjects() {

+        EntityManager em = emf.createEntityManager();

+        List<?> result = em.createQuery("SELECT a FROM SimpleEntity a").getResultList();

+        assert(result.size() == 1);

+        em.close();

+        return result;

+    }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestStaticPersistence.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestStaticPersistence.java
new file mode 100644
index 0000000..5e2ae2d
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestStaticPersistence.java
@@ -0,0 +1,56 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import javax.persistence.Persistence;

+import javax.persistence.EntityManagerFactory;

+

+import org.junit.*;

+

+/**

+ * Test class to test static Persistence class using OSGi JPA services

+ * 

+ * @author mkeith

+ */

+public class TestStaticPersistence extends JpaTest {

+    

+    public static final String TEST_NAME = "TestStaticPersistence";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "Accounts";

+

+    public static EntityManagerFactory emf;

+

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_UNDER_TEST);

+        slog(TEST_NAME, "Got EMF - " + emf);

+    }

+

+    @AfterClass

+    public static void classCleanUp() throws Exception {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Subclassed methods === */

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+}

diff --git a/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestWeaving.java b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestWeaving.java
new file mode 100644
index 0000000..88948c7
--- /dev/null
+++ b/org.eclipse.gemini.jpa.tests/src/org/eclipse/gemini/jpa/tests/TestWeaving.java
@@ -0,0 +1,101 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Oracle.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * and Apache License v2.0 which accompanies this distribution. 

+ * The Eclipse Public License is available at

+ *     http://www.eclipse.org/legal/epl-v10.html

+ * and the Apache License v2.0 is available at 

+ *     http://www.opensource.org/licenses/apache2.0.php.

+ * You may elect to redistribute this code under either of these licenses.

+ *

+ * Contributors:

+ *     mkeith - Gemini JPA tests 

+ ******************************************************************************/

+package org.eclipse.gemini.jpa.tests;

+

+import java.util.List;

+

+import javax.persistence.EntityManager;

+import javax.persistence.EntityManagerFactory;

+

+import model.weaved.WeavedEntity;

+

+import org.junit.*;

+

+/**

+ * Test class to test weaving of JPA provider

+ * 

+ * @author mkeith

+ */

+public class TestWeaving extends JpaTest {

+    

+    public static final String TEST_NAME = "TestWeaving";

+    public static final String PERSISTENCE_UNIT_UNDER_TEST = "Weaved";

+

+    public static EntityManagerFactory emf;

+

+    /* === Test Methods === */

+

+    @BeforeClass

+    public static void classSetUp() {

+        slog(TEST_NAME, "In setup");

+        emf = lookupEntityManagerFactory(TEST_NAME, PERSISTENCE_UNIT_UNDER_TEST);                

+        slog(TEST_NAME, "Got EMF - " + emf);        

+    }

+

+    @AfterClass

+    public static void classCleanUp() throws Exception {

+        if (emf != null) {

+            emf.close();

+            emf = null;

+        }

+    }

+

+    /* === Additional test methods === */

+    @Test

+    public void testWovenClass() {

+        log("testWovenClass");

+        WeavedEntity entity = new WeavedEntity();

+        boolean weaved = false;

+

+        Class<?>[] clsArray = entity.getClass().getInterfaces();

+        for ( Class<?> cls : clsArray) {

+            if (cls.toString().equals("org.eclipse.persistence.internal.weaving.PersistenceWeaved")) {

+                weaved = true;

+                break;

+            }

+        }

+        assert(weaved) ;

+    }

+    

+    /* === Subclassed methods === */

+

+    // Dues to Lazy EMF creation, and the fact that we are never actually invoking  

+    // methods on the EMF, the real underlying provider EMF is never really created

+    public boolean needsDsfService() { return false; }

+

+    public EntityManagerFactory getEmf() { return emf; }

+

+    public String getTestPersistenceUnitName() { return PERSISTENCE_UNIT_UNDER_TEST; }

+

+    public Object newObject() {

+        WeavedEntity a = new WeavedEntity();

+        a.setId(100);

+        return a;

+    }

+    

+    public Object findObject() {

+        EntityManager em = getEmf().createEntityManager();

+        Object obj = em.find(WeavedEntity.class, 100);        

+        em.close();

+        return obj;

+    }

+

+    public Object queryObjects() {

+        EntityManager em = getEmf().createEntityManager();

+        List<?> result = em.createQuery("SELECT a FROM WeavedEntity a").getResultList();

+        em.close();

+        return result;

+    }        

+}