You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-commits@db.apache.org by mb...@apache.org on 2005/05/22 20:40:21 UTC

svn commit: r171355 [16/31] - in /incubator/jdo/trunk/fostore20: ./ src/ src/conf/ src/java/ src/java/org/ src/java/org/apache/ src/java/org/apache/jdo/ src/java/org/apache/jdo/impl/ src/java/org/apache/jdo/impl/fostore/ test/ test/conf/ test/fsuid2/ test/fsuid2/org/ test/fsuid2/org/apache/ test/fsuid2/org/apache/jdo/ test/fsuid2/org/apache/jdo/pc/ test/java/ test/java/org/ test/java/org/apache/ test/java/org/apache/jdo/ test/java/org/apache/jdo/impl/ test/java/org/apache/jdo/impl/fostore/ test/java/org/apache/jdo/pc/ test/java/org/apache/jdo/pc/appid/ test/java/org/apache/jdo/pc/empdept/ test/java/org/apache/jdo/pc/serializable/ test/java/org/apache/jdo/pc/xempdept/ test/java/org/apache/jdo/test/ test/java/org/apache/jdo/test/query/ test/java/org/apache/jdo/test/util/ test/jdo/ test/jdo/org/ test/jdo/org/apache/ test/jdo/org/apache/jdo/ test/jdo/org/apache/jdo/pc/ test/jdo/org/apache/jdo/pc/appid/ test/jdo/org/apache/jdo/pc/empdept/ test/jdo/org/apache/jdo/pc/serializable/ test/jdo/org/apache/jdo/pc/xempdept/

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_4510817.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_4510817.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_4510817.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_4510817.java Sun May 22 11:40:13 2005
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import javax.jdo.PersistenceManager;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+/**
+ * Test fix for bug 4510817: Ensure that PersistenceManager.getObjectIdClass
+ * returns null when given class does not implement PersistenceCapable or is
+ * null.
+ */
+public class Test_4510817 extends AbstractTest {
+    
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_4510817.class);
+    }
+
+    /** */
+    public void test() {
+        PersistenceManager pm = pmf.getPersistenceManager();
+
+        try {
+            // First case: Given class does not implement PersistenceCapable.
+            Class c1 = pm.getObjectIdClass(Thread.class);
+            assertNull("ObjectIdClass for Thread.class is not null: " + c1, c1);
+
+            // Second case: Given parameter is null.
+            Class c2 = pm.getObjectIdClass(null);
+            assertNull("ObjectIdClass for null is not null: " + c2, c2);
+
+            if (debug)
+                logger.debug("Success: ObjectIdClass for Thread.class and null returns null");
+        }
+        finally {
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_4515265.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_4515265.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_4515265.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_4515265.java Sun May 22 11:40:13 2005
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import javax.jdo.*;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+/**
+ * Test fix for bug 4515265: StoreManager.getClassForOid must throw
+ * JDOUserException if given parameter is not an OID (spec section 12.5.6).
+ */
+public class Test_4515265 extends AbstractTest {
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_4515265.class);
+    }
+
+    // Test different wrong cases of application identity:
+    class PCPointKey {
+        int x;
+        Integer y;
+
+        PCPointKey(int _x, int _y) {
+            x = _x;
+            y = new Integer(_y);
+        }
+    }
+    
+    class Oid {
+        int x;
+        Integer y;
+
+        Oid(int _x, int _y) {
+            x = _x;
+            y = new Integer(_y);
+        }
+    }
+        
+    public void test() {
+        Oid oid = new Oid(1, 1);
+        PCPointKey key = new PCPointKey(1, 1);
+
+        PersistenceManager pm = pmf.getPersistenceManager();
+
+        try {
+            try {
+                pm.getObjectById(key, true);
+                fail("getObjectById should throw an exception or non-existing PC Class.");
+            } catch (JDOUserException ex) {
+                // expected exception => OK
+                if (debug)
+                    logger.debug("Caught expected JDOUserException for non-existing PC Class.");
+            }
+
+            try {
+                pm.getObjectById(oid, true); 
+                fail("getObjectById should throw an exception for non-PC Class."); 
+            } catch (JDOUserException ex) {
+                // expected exception => OK
+                if (debug)
+                    logger.debug("Caught expected JDOUserException for non-PC Class.");
+            }
+
+            try {
+                pm.getObjectById(this, true);
+                fail("getObjectById should throw an exception for wrong OID Class name.");
+            } catch (JDOUserException ex) {
+                // expected exception => OK
+                if (debug)
+                    logger.debug("Caught expected JDOUserException for wrong OID Class name.");
+            }
+        }
+        finally {
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_6214617.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_6214617.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_6214617.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_6214617.java Sun May 22 11:40:13 2005
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.JDOUserException;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+/**
+ * Test fix for bug 6214617: the pm is still open after pm.close fails
+ * because of an active transaction. 
+ */
+public class Test_6214617 extends AbstractTest {
+    
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_6214617.class);
+    }
+
+    /** */
+    public void test() {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        try {
+            pm.currentTransaction().begin();
+            pm.close(); // fails because tx is still active
+        }
+        catch (JDOUserException ex) {
+            // expected exception: cannot close pm while tx is active
+            if (debug) 
+                logger.debug("Caught expected JDOUserException cannot close pm while tx is active");
+        }
+        finally {
+            // should succeed
+            pm.currentTransaction().rollback();
+            pm.close();
+            if (debug) 
+                logger.debug("Could rollback tx and close pm");
+        }
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ActivateClass.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ActivateClass.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ActivateClass.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ActivateClass.java Sun May 22 11:40:13 2005
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+import org.apache.jdo.test.util.Factory;
+import org.apache.jdo.pc.PointFactory;
+
+/**
+* Tests that we can activate a class.  Actually goes farther than that,
+* storing the value of an instance of a class, since that's the only way we can
+* cause a class to be activated.
+*
+* @author Dave Bristor
+*/
+public class Test_ActivateClass extends AbstractTest {
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_ActivateClass.class);
+    }
+
+    /**
+     * Inserts some number of objects in the database
+     */
+    public void test() throws Exception {
+        insertObjects();
+    }
+
+    /**
+     * Determines the kind of objects that are inserted.  Override this if
+     * you want to insert some other kind of object.
+     */
+    protected Factory getFactory(int verify) {
+        PointFactory rc = new PointFactory();
+        rc.setVerify(verify);
+        return rc;
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_AppId.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_AppId.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_AppId.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_AppId.java Sun May 22 11:40:13 2005
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import java.util.*;
+
+import javax.jdo.*;
+
+import org.apache.jdo.pc.PCPoint1;
+import org.apache.jdo.pc.PCPoint1Key;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+/**
+* Tests that FOStore can perform insert/update/fetch/delete for 
+* an instance with application identity.
+*
+* @author Marina Vatkina
+*/
+public class Test_AppId extends AbstractTest {
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_AppId.class);
+    }
+
+    /** */
+    public void test() {
+
+        int start = -numInsert;
+        int end = numInsert + 1; // exclusive!
+        int nrOfObjects = end - start;
+        PCPoint1Key pk  = new PCPoint1Key();
+        
+        PersistenceManager pm = pmf.getPersistenceManager();
+        Transaction tx = pm.currentTransaction();
+        
+        try {
+            if (debug){
+                logger.debug("====================");
+                logger.debug("INSERT");
+            }
+        
+            tx.begin();
+            for (int i = start; i < end; i++) {
+                PCPoint1 p = new PCPoint1(i,10*i);
+                pm.makePersistent(p);
+                if (debug) logger.debug("Inserting: " + p);
+            }
+            tx.commit(); tx = null;
+            pm.close(); pm = null;
+
+            if (debug){
+                logger.debug("====================");
+                logger.debug("UPDATE");
+            }
+
+            pm = pmf.getPersistenceManager();
+            tx = pm.currentTransaction();
+            tx.begin();
+            for (int i = start; i < end; i++) {
+                pk.x = i;
+                PCPoint1 p = (PCPoint1)pm.getObjectById(pk, true);
+                p.setY(new Integer(i+100));
+                if (debug) logger.debug("Updating: " + p);
+                if (debug) printObject(p, pm);
+            }
+            tx.commit(); tx = null;
+            pm.close(); pm = null;
+            
+            if (debug) {
+                logger.debug("====================");
+                logger.debug("EXTENT");
+            }
+            
+            pm = pmf.getPersistenceManager();
+            List list = new ArrayList();
+            Extent ext = pm.getExtent(org.apache.jdo.pc.PCPoint1.class, false);
+            for (java.util.Iterator i = ext.iterator(); i.hasNext();) {
+                PCPoint1 p = (PCPoint1)i.next();
+                if (debug) logger.debug("Fetched: " + p);
+                if (debug) printObject(p, pm);
+                list.add(p);
+            }
+            Collections.sort(list, new PCPoint1Comparator());
+            assertEquals("Extent has wrong size", nrOfObjects, list.size());
+            for (int i = start; i < end; i++) {
+                PCPoint1 p = (PCPoint1)list.get(i - start);
+                assertEquals("Wrong value of PCPoint1.x", i, p.getX());
+                assertEquals("Wrong value of PCPoint1.y", (i+100), p.getY().intValue());
+            }
+            pm.close(); pm = null;
+            
+            if (debug) {
+                logger.debug("====================");
+                logger.debug("DELETE");
+            }
+            
+            pm = pmf.getPersistenceManager();
+            tx = pm.currentTransaction();
+            tx.begin();
+            for (int i = start; i < end; i++) {
+                pk.x = i;
+                PCPoint1 p = (PCPoint1)pm.getObjectById(pk, true);
+                if (debug) logger.debug("Deleting: " + p);
+                if (debug) printObject(p, pm);
+                pm.deletePersistent(p);
+            }
+            tx.commit(); tx = null;
+            pm.close(); pm = null;
+            
+            if (debug) {
+                logger.debug("====================");
+                logger.debug("CHECK DELETED");
+            }
+
+            pm = pmf.getPersistenceManager();
+            for (int i = start; i < end; i++) {
+                pk.x = i;
+                try {
+                    PCPoint1 p = (PCPoint1)pm.getObjectById(pk, true);
+                    fail("Object with primary key " + pk + " was found: " + p);
+                } catch (JDODataStoreException ex) {
+                    // expected exception => OK;
+                    if (debug) logger.debug("Deleted " + pk);
+                }
+            }
+            pm.close(); pm = null;
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+
+    void printObject(PCPoint1 p, PersistenceManager pm) {
+        Object oid = pm.getObjectId(p);
+        logger.debug("Instance OID: " + oid);
+
+        PersistenceManager pm1 = pmf.getPersistenceManager();
+        Object o =  pm1.getObjectById(oid, true);
+        logger.debug("Instance from OID: " + o);
+        logger.debug("OID from instance: " + pm1.getObjectId(o));
+        pm1.close();
+    }
+
+    static class PCPoint1Comparator implements Comparator
+    {
+        public int compare(Object o1, Object o2) {
+            if (!(o1 instanceof PCPoint1))
+                throw new ClassCastException("instance " + o1 +
+                        " + is not a PCPoint1 instance");
+            if (!(o2 instanceof PCPoint1))
+                throw new ClassCastException("instance " + o2 +
+                        " + is not a PCPoint1 instance");
+            return new Integer(((PCPoint1)o1).getX()).compareTo(
+                new Integer(((PCPoint1)o2).getX()));
+        }
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Arrays.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Arrays.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Arrays.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Arrays.java Sun May 22 11:40:13 2005
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import javax.jdo.*;
+
+import org.apache.jdo.test.util.JDORITestRunner;
+
+import org.apache.jdo.pc.PCArrays;
+
+/**
+* Tests that arrays can be stored in the datastore.
+*
+* @author Dave Bristor
+*/
+public class Test_Arrays extends Test_Fetch {
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_Arrays.class);
+    }
+
+    /** */
+    public void test() throws Exception {
+        insertObjects();
+        readObjects();
+        checkExtent(PCArrays.class, 1);
+    }
+
+    /** Redefine to insert our own objects. */
+    protected void insertObjects() {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        Transaction tx = pm.currentTransaction();
+        try {
+            tx.begin();
+            PCArrays pcArrays = new PCArrays();
+            pcArrays.init();
+            if (debug) logger.debug("Before insert: " + pcArrays);
+            pm.makePersistent(pcArrays);
+            tx.commit();
+        
+            Object oid1 = JDOHelper.getObjectId(pcArrays);
+            if (debug) logger.debug("inserted pcArrays: " + oid1);
+            oids.add(oid1);
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+
+    /**
+     * redefine verify called by readObjects to check whether the read
+     * instance is correct.
+     */
+    protected void verify(int i, Object pc) {
+        if (i > 0)
+            fail("Wrong number of inserted objects, expected only one");
+        PCArrays expected = new PCArrays();
+        expected.init();
+        // PCArrays does not redefine equals, so use the string representation
+        assertEquals("Wrong instance returned from datastore", expected.toString(), pc.toString());
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ClassRegistration.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ClassRegistration.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ClassRegistration.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ClassRegistration.java Sun May 22 11:40:13 2005
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import java.util.*;
+import java.lang.reflect.*;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+/**
+ * Test registration and unregistration of pc classes.
+ *
+ * @author Michael Bouschen
+ * @since 1.0.2
+ */
+public class Test_ClassRegistration extends AbstractTest {
+    
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_ClassRegistration.class);
+    }
+
+    /** */
+    protected void setUp() { }
+
+    /** */
+    protected void tearDown()  { }
+
+    /** */
+    public void test() throws Throwable {
+        String jdoapi = System.getProperty("jdoapi");
+        String pcclasses = System.getProperty("pcclasses");
+        final URL jdoapiURL = new URL("file:" + jdoapi);
+        final URL pcclassesURL = new URL("file:" + pcclasses);
+        ClassLoader cl = (ClassLoader)AccessController.doPrivileged(
+            new PrivilegedAction () {
+                public Object run () {
+                    return new URLClassLoader(new URL[] {pcclassesURL, jdoapiURL}, null);
+                }});
+        Class implHelperClass = getImplHelperClass(cl);
+        Object implHelper = callGetInstance(implHelperClass);
+
+        // -------------------------------------------
+        // Test registration
+        // -------------------------------------------
+
+        // This loads the pc class
+        Class employeeClass = loadPCClass("org.apache.jdo.pc.empdept.PCEmployee", cl);
+        
+        Collection registeredClasses = 
+            callGetRegisteredClasses(implHelperClass, implHelper);
+        int nrOfRegisteredClasses = registeredClasses.size();
+
+        // test whether PCEmployee is registered
+        assertTrue("Missing registered class " + employeeClass, 
+                   registeredClasses.contains(employeeClass));
+
+        // -------------------------------------------
+        // Test unregistration by class
+        // -------------------------------------------
+
+        // test unregisterClass with null parameter
+        try {
+            callUnregisterClass(implHelperClass, implHelper, null);
+            fail("Missing exception when calling unregisterClass(null)");
+        }
+        catch (NullPointerException ex) {
+            // expected exception => OK
+        }
+        
+        // test unregister by class
+        callUnregisterClass(implHelperClass, implHelper, employeeClass);
+        registeredClasses = callGetRegisteredClasses(implHelperClass, implHelper);
+        int newNrOfRegisteredClasses = registeredClasses.size();
+        // test nr of registered classes is decremented
+        assertEquals("Wrong number of registered classes", 
+                     (nrOfRegisteredClasses - 1), newNrOfRegisteredClasses);
+
+        // test PCEmployee not registered anymore
+        assertFalse("Class " + employeeClass + " still registered", 
+                    registeredClasses.contains(employeeClass));
+        
+        // -------------------------------------------
+        // Test unregistration by class loader
+        // -------------------------------------------
+         
+        // test unregister by classLoader
+        callUnregisterClasses(implHelperClass, implHelper, cl);
+        registeredClasses = callGetRegisteredClasses(implHelperClass, implHelper);
+        assertTrue("Unregistration failed, set of registered classes is not empty: " + registeredClasses,
+                   registeredClasses.isEmpty());
+
+        // Test succeeded
+    }
+ 
+    /** */
+    private Class loadPCClass(String className, ClassLoader cl)
+        throws Exception
+    {
+        Class pcClass = Class.forName(className, true, cl);
+        assertEquals("PC class " + className + " loaded by wrong class loader",
+                     cl, getClassLoaderForClass(pcClass));
+        return pcClass;
+    }
+
+    /** */
+    private Class getImplHelperClass(ClassLoader cl)
+        throws Exception
+    {
+        Class implHelperClass = 
+            Class.forName("javax.jdo.spi.JDOImplHelper", true, cl);
+        assertEquals("JDOImplHelper loaded by wrong class loader", 
+                     cl, getClassLoaderForClass(implHelperClass));
+        return implHelperClass;
+    }
+
+    /** */
+    private Object callGetInstance(Class implHelperClass)
+        throws Throwable
+    {
+        final Method method = implHelperClass.getMethod("getInstance", null);
+        try {
+            return AccessController.doPrivileged(
+                new PrivilegedExceptionAction () {
+                    public Object run () throws Exception {
+                        return method.invoke(null, null);
+                    }});
+        }
+        catch (PrivilegedActionException pae) {
+            Throwable e = pae.getException();
+            if (e instanceof InvocationTargetException)
+                e = ((InvocationTargetException)e).getTargetException();
+            throw e;
+        }
+    }
+    
+    /** */
+    private Collection callGetRegisteredClasses(Class implHelperClass, Object implHelper)
+        throws Throwable
+    {
+        Method method = implHelperClass.getMethod("getRegisteredClasses", null);
+        try {
+            return (Collection)method.invoke(implHelper, null);
+        }
+        catch (InvocationTargetException ex) {
+            throw ((InvocationTargetException)ex).getTargetException();
+        }
+    }
+
+    /** */
+    private void callUnregisterClass(final Class implHelperClass, 
+                                     final Object implHelper, 
+                                     final Class parameter)
+        throws Throwable
+    {
+        final Method method = implHelperClass.getMethod(
+            "unregisterClass", new Class[] {Class.class});
+        try {
+            AccessController.doPrivileged(
+                new PrivilegedExceptionAction () {
+                    public Object run () throws Exception {
+                        return method.invoke(implHelper, new Object[] {parameter});
+                    }});
+        }
+        catch (PrivilegedActionException pae) {
+            Throwable e = pae.getException();
+            if (e instanceof InvocationTargetException)
+                e = ((InvocationTargetException)e).getTargetException();
+            throw e;
+        }
+    }
+
+    /** */
+    private void callUnregisterClasses(final Class implHelperClass, 
+                                       final Object implHelper, 
+                                       final ClassLoader parameter)
+        throws Throwable
+    {
+        final Method method = implHelperClass.getMethod(
+            "unregisterClasses", new Class[] {ClassLoader.class});
+        try {
+            AccessController.doPrivileged(
+                new PrivilegedExceptionAction () {
+                    public Object run () throws Exception {
+                        return method.invoke(implHelper, new Object[] {parameter});
+                    }});
+        }
+        catch (PrivilegedActionException pae) {
+            Throwable e = pae.getException();
+            if (e instanceof InvocationTargetException)
+                e = ((InvocationTargetException)e).getTargetException();
+            throw e;
+        }
+    }
+
+    /** */
+    private ClassLoader getClassLoaderForClass(final Class clazz)
+    {
+        if (clazz == null) 
+            return null;
+        return(ClassLoader)AccessController.doPrivileged(
+            new PrivilegedAction () {
+                public Object run () {
+                    return clazz.getClassLoader();
+                }});
+    }
+    
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ClosePMF.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ClosePMF.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ClosePMF.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_ClosePMF.java Sun May 22 11:40:13 2005
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+/*
+ * Test_ClosePMF.java
+ *
+ * Created on April 8, 2003, 2:59 PM
+ */
+
+package org.apache.jdo.test;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import javax.jdo.PersistenceManager;
+import javax.jdo.Transaction;
+import javax.jdo.JDOUserException;
+import javax.jdo.JDOException;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+import org.apache.jdo.test.util.Factory;
+import org.apache.jdo.pc.PointFactory;
+
+/**
+ * Test that PMF.close() behaves properly.  This test creates multiple PMs
+ * and verifies that close() throws an exception with a nested exception
+ * for each PM still open; once all PMs are closed, then close() should
+ * complete normally.
+ * 
+ * @author  Craig Russell
+ */
+public class Test_ClosePMF extends AbstractTest {
+    
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_ClosePMF.class);
+    }
+
+    /** Creates a new instance of Test_ClosePMF */
+    public Test_ClosePMF() {
+        super();
+    }
+    
+    /**
+     * Inserts some number of objects in the database.  Here, we just get
+     * some PMs and use them to add objects.  Next, we get a PM that is not
+     * closed explicitly (it should be closed automatically by PMF.close()).
+     * Next, get a PM, begin a tx and verify that this one causes PMF.close()
+     * to fail.
+     */
+    public void test() throws Exception {
+        PersistenceManager pm0 = null;
+        PersistenceManager pm2 = null;
+        PersistenceManager pm4 = null;
+        try {
+            pm0 = pmf.getPersistenceManager();
+            pm0.currentTransaction().begin();
+            pm0.currentTransaction().rollback();
+            insertObjects(); // this pm is closed by insertObjects
+            pm2 = pmf.getPersistenceManager();
+            pm2.currentTransaction().begin();
+            pm2.currentTransaction().commit();
+            insertObjects(); // this pm is closed by insertObjects
+            pm4 = pmf.getPersistenceManager();
+            pm4.currentTransaction().begin();
+
+            assertNotClosed(pm0, "pm0");
+            assertNotClosed(pm2, "pm2");
+            assertNotClosed(pm4, "pm4");
+            JDOUserException jdouex = null;
+            try {
+                AccessController.doPrivileged(new PrivilegedAction () {
+                        public Object run () throws JDOUserException {
+                            pmf.close(); // this should throw an exception with pm4
+                            return null;
+                        }});
+            } catch (JDOUserException ex) {
+                jdouex = ex;
+            } catch (Exception ex) {
+                fail("Wrong exception, expected JDOUserException, got " + ex);
+            }
+            
+            assertNotNull("Failed to catch exception from close.", jdouex);
+
+            Throwable[] nested = jdouex.getNestedExceptions();
+            assertEquals("Got wrong number of nested exceptions", 1, nested.length);
+
+            JDOException jdoex = (JDOException)nested[0];
+            Object failed = jdoex.getFailedObject();
+            assertTrue("Got wrong failed object of type: " + failed.getClass().getName() + 
+                       ", expected PersistenceManager.", (failed instanceof PersistenceManager));
+
+            assertEquals("Got wrong PersistenceManager", pm4, failed);
+
+            // since we didn't explicitly close these, they should still be open
+            assertNotClosed(pm0, "pm0");
+            assertNotClosed(pm2, "pm2");
+            assertNotClosed(pm4, "pm4");
+            pm4.currentTransaction().commit();
+            // now any exception is fatal
+            AccessController.doPrivileged(new PrivilegedAction () {
+                    public Object run () throws JDOUserException {
+                        pmf.close(); 
+                        return null;
+                    }});
+            // the pmf.close() should have closed all the open pms
+            assertClosed(pm0, "pm0");
+            assertClosed(pm2, "pm2");
+            assertClosed(pm4, "pm4");
+            // should be able to call this now without effect
+            pmf.close();
+        }
+        finally {
+            finalizePM(pm0);
+            finalizePM(pm2);
+            finalizePM(pm4);
+        }
+    }
+
+    void assertNotClosed(PersistenceManager pm, String msg) {
+        assertFalse("PersistenceManager " + msg + "(" + pm + ") is closed.", pm.isClosed());
+    }
+
+    void assertClosed(PersistenceManager pm, String msg) {
+        assertTrue("PersistenceManager " + msg + "(" + pm + ") is not closed.", pm.isClosed());
+    }
+
+    void finalizePM(PersistenceManager pm)
+    {
+        if (pm != null && !pm.isClosed()) {
+            Transaction tx = pm.currentTransaction();
+            if ((tx != null) && tx.isActive()) {
+                tx.rollback();
+            }
+            pm.close();
+        }
+    }
+    
+    /** Redefine getFactory called be insertObjects. */
+    protected Factory getFactory(int verify)
+    {
+        return new PointFactory();
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Collections.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Collections.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Collections.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Collections.java Sun May 22 11:40:13 2005
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import org.apache.jdo.test.util.JDORITestRunner;
+
+import org.apache.jdo.pc.PCCollections;
+
+/**
+* This test tries to insert a persistent capable object into a database;
+* the object has a field of each of the kind of primitive and immutable
+* Java types.
+*
+* @author Dave Bristor
+*/
+public class Test_Collections extends Test_SCO_Base {
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_Collections.class);
+    }
+
+    /** */
+    public void test() throws Exception {
+        insertObjects();
+        readObjects();
+        checkExtent(PCCollections.class, 1);
+    }
+
+    /** */
+    protected void insertObjects() {
+        insertAllTypes();
+    }
+
+    /**
+     * redefine verify called by readObjects to check whether the read
+     * instance is correct.
+     */
+    protected void verify(int i, Object pc) {
+        switch (i) {
+        case 0 :
+            assertEquals("Wrong PCPoint instance", createPoint(), pc);
+            break;
+        case 1:
+            assertEqualsPCCollections(createAllTypes(createPoint()), pc);
+            break;
+        default:
+            fail("Wrong number of inserted objects, expected two");
+            break;
+        }
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Container.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Container.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Container.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Container.java Sun May 22 11:40:13 2005
@@ -0,0 +1,358 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+/*
+ * Test_Container.java
+ *
+ * Created on August 30, 2001
+ */
+
+package org.apache.jdo.test;
+
+import java.util.*;
+
+import javax.jdo.*;
+
+import org.apache.jdo.pc.PCPoint;
+import org.apache.jdo.test.util.Container;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+/**
+ * Test driver to test transactions in a managed environment
+ * 
+ * @author Marina Vatkina
+ */
+public class Test_Container extends AbstractTest {
+
+    Container tc = null;
+    String url = null;
+    Object oid = null;
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_Container.class);
+    }
+
+    /** */
+    protected void setUp()  {
+        tc = new Container(debug);
+        url = createURL();
+    }
+
+    /** */
+    protected void tearDown()  {
+        pmf = tc.close();
+        closePMF();
+    }
+
+    /** */
+    public void test() {
+        String repr = null;
+
+        // Insert - rollback
+        if (debug) logger.debug("===TESTCMT_NEG: ");
+        runTestCMT(false);
+        
+        // Insert - commit
+        if (debug) logger.debug("===TESTCMT_POS: ");
+        runTestCMT(true);
+        
+        // Get Extent with 1 instance
+        if (debug) logger.debug("===QUERY: ");
+        repr = queryInstance();
+        assertEquals("Wrong PCPoint instance",
+                     "org.apache.jdo.pc.PCPoint x: 9, y: 999", repr);
+
+        // Update instance and test the same PMs in both "beans"
+        if (debug) logger.debug("===TESTCMT_CMT: ");
+        runTestCMT_CMT();
+
+        // Update instance and test the same PMs in both "beans"
+        if (debug) logger.debug("===TESTBMT_JDO_CMT: ");
+        runTestBMT_JDO_CMT();
+
+        // Update instance 
+        if (debug) logger.debug("===TESTBMT_JDO_POS: ");
+        runTestBMT_JDO_POS();
+
+        // Get Extent with 1 updated instance
+        if (debug) logger.debug("===QUERY: ");
+        repr = queryInstance();
+        assertEquals("Wrong PCPoint instance",
+                     "org.apache.jdo.pc.PCPoint x: 72, y: 720", repr);
+
+        // Delete the instance
+        if (debug) logger.debug("===TESTBMT_UT_POS: ");
+        runTestBMT_UT_POS();
+
+        // Get Extent with 0 instances
+        if (debug) logger.debug("===QUERY: ");
+        repr = queryInstance();
+        assertEquals("Empty query result expected", "NONE", repr);
+
+        // Fail to delete instance got by non-existent Oid
+        if (debug) logger.debug("===TESTBMT_UT_NEG: ");
+        runTestBMT_UT_NEG();
+
+        // Fail to update instance got by non-existent Oid
+        if (debug) logger.debug("===TESTBMT_JDO_NEG: ");
+        runTestBMT_JDO_NEG();
+    }
+
+    private void runTestCMT(boolean commit) {
+        PersistenceManager pm = null;
+        try {
+            PersistenceManagerFactory pmf = tc.getPMF(url);
+            tc.startCMT();
+            pm = pmf.getPersistenceManager();
+
+            Object o = createInstance();
+            pm.makePersistent(o);
+        
+            oid = pm.getObjectId(o);
+        }
+        finally {
+            pm.close();
+        
+            // This is a hack to make transaction fail:
+            tc.finishCMT(commit);
+        }
+    }
+    
+    private void runTestCMT_CMT() {
+        PersistenceManager pm = null;
+        try {
+            PersistenceManagerFactory pmf = tc.getPMF(url);
+            tc.startCMT();
+            pm = pmf.getPersistenceManager();
+
+            PCPoint p = (PCPoint)pm.getObjectById(oid, false); 
+            updateInstance(p);
+
+            validate(p, pm);
+
+        } finally {
+            pm.close();
+            tc.finishCMT(true);
+        }
+    }
+
+    private void runTestBMT_JDO_CMT() {
+        PersistenceManager pm = null;
+        Transaction tx = null;
+        try { 
+            PersistenceManagerFactory pmf = tc.getPMF(url);
+            tc.startBMT(); 
+            pm = pmf.getPersistenceManager(); 
+            tx = pm.currentTransaction();
+            tx.begin();
+
+            PCPoint p = (PCPoint)pm.getObjectById(oid, false); 
+            updateInstance(p);
+
+            validate(p, pm);
+            
+            tx.commit();
+        } finally {
+            if ((tx != null) && tx.isActive())
+                tx.rollback();
+            pm.close();
+            tc.finishBMT(); 
+        }
+    }
+    
+    private void runTestBMT_JDO_POS() { 
+        PersistenceManager pm = null;
+        Transaction tx = null;
+        try {
+            PersistenceManagerFactory pmf = tc.getPMF(url);
+            tc.startBMT(); 
+            pm = pmf.getPersistenceManager(); 
+            tx = pm.currentTransaction();
+            tx.begin();
+
+            updateInstance((PCPoint)pm.getObjectById(oid, false)); 
+
+            tx.commit();
+        }
+        finally {
+            if ((tx != null) && tx.isActive())
+                tx.rollback();
+            pm.close();
+            tc.finishBMT(); 
+        }
+    }
+
+    private void runTestBMT_JDO_NEG() { 
+        PersistenceManager pm = null;
+        Transaction tx = null;
+        try {
+            PersistenceManagerFactory pmf = tc.getPMF(url);
+            tc.startBMT(); 
+            pm = pmf.getPersistenceManager(); 
+            tx = pm.currentTransaction();
+            tx.begin();
+            
+            updateInstance((PCPoint)pm.getObjectById(oid, false)); 
+            
+            tx.commit();
+            fail("ERROR TO FINISH: ");
+        } catch (Exception e) { 
+            if (debug)
+                logger.debug ("EXPECTED FOR testBMT_JDO_NEG: " + e.getMessage());
+            tx.rollback();
+        } 
+        finally {
+            pm.close();
+            tc.finishBMT(); 
+        }
+    }
+
+
+    private void runTestBMT_UT_POS() {  
+        PersistenceManager pm = null;
+        try { 
+            PersistenceManagerFactory pmf = tc.getPMF(url);
+            tc.startBMT();
+            tc.getUserTransaction().begin();
+            
+            pm = pmf.getPersistenceManager(); 
+            pm.deletePersistent(pm.getObjectById(oid, false));  
+            
+            pm.close();
+            tc.getUserTransaction().commit();
+        } catch (Exception e) {  
+            if (debug) logger.debug ("testBMT_UT_POS: " + e);
+            try {
+                tc.getUserTransaction().rollback();
+            } catch (Exception e1) {
+                if (debug) logger.debug("testBMT_UT_POS: " + e1);
+                fail("testBMT_UT_POS: " + e1);
+            }
+        }
+        finally {
+            if (pm != null && !pm.isClosed())
+                pm.close();
+            tc.finishBMT(); 
+        }
+    }
+
+    private void runTestBMT_UT_NEG() {  
+        PersistenceManager pm = null;
+        try { 
+            PersistenceManagerFactory pmf = tc.getPMF(url);
+            tc.startBMT();
+            tc.getUserTransaction().begin();
+
+            pm = pmf.getPersistenceManager(); 
+            pm.deletePersistent(pm.getObjectById(oid, false));  
+
+            pm.close();
+
+            tc.getUserTransaction().commit();
+            tc.finishBMT(); 
+            fail("ERROR TO FINISH: ");
+        } catch (Exception e) {  
+            if (debug)
+                logger.debug ("EXPECTED FOR testBMT_UT_NEG: " + e.getMessage());
+            try {
+                tc.getUserTransaction().rollback();
+            } catch (Exception e1) {
+                if (debug) logger.debug ("ERROR IN testBMT_UT_NEG: " + e1);
+                fail("ERROR IN testBMT_UT_NEG: " + e1);
+            }
+        }
+        finally {
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+        
+    }
+
+    private PCPoint createInstance() {
+        PCPoint p = new PCPoint(9, 999);
+        return p;
+    }
+
+    private void updateInstance(PCPoint p) {
+        int i = p.getX();
+        p.setX(i*2);
+        p.setY(new Integer(i*20));
+    }
+
+
+    private String queryInstance() {
+        PersistenceManagerFactory pmf = tc.getPMF(url);
+        tc.startBMT();
+        PersistenceManager pm = pmf.getPersistenceManager();
+/* Not yet implemented
+        Query query = pm.newQuery();
+        query.setClass (test.PCPoint.class);
+        query.setFilter("x == " + ???);
+        query.setCandidates(pm.getExtent(test.PCPoint.class, false));
+
+        Object result = query.execute();
+*/
+        Extent result = pm.getExtent(org.apache.jdo.pc.PCPoint.class, false);
+
+        String s = "";
+        if (result ==  null) {
+            s = "NULL";
+        } else {
+            int count = 0;
+            Object pc = null;
+
+            for (Iterator i = result.iterator(); i.hasNext();) {
+                pc = i.next();
+                count++;
+            }
+            if ( count == 0 ) {
+                s = "NONE";
+            } else if ( count > 1 ) {
+                s = "MANY";
+            } else {
+                s = "" + pc;
+            }
+        }
+        pm.close();
+        tc.finishBMT();
+
+        return s;
+    }
+
+    private void validate(PCPoint e, PersistenceManager pm0) {
+        PersistenceManagerFactory pmf = tc.getPMF(url);
+        PersistenceManager pm = pmf.getPersistenceManager();
+
+        PCPoint p = (PCPoint)pm.getObjectById(oid, false);
+
+        if (p != e) {
+            fail("OBJECTS NOT EQUAL: " + e + " <> " + p);
+        } else {
+            if (debug) logger.debug ("OBJECTS ARE EQUAL!!! " );
+        }
+
+        if (!pm0.equals(pm)) {
+            fail("PMS NOT EQUAL!!!");
+        } else {
+            if (debug) logger.debug ("PMS ARE EQUAL!!!");
+        }
+
+        pm.close();
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Cycle.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Cycle.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Cycle.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Cycle.java Sun May 22 11:40:13 2005
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import javax.jdo.*;
+
+import org.apache.jdo.test.util.JDORITestRunner;
+
+import org.apache.jdo.pc.PCCycle;
+import org.apache.jdo.pc.PCCycle2;
+
+//
+// This _test_ does not yet work.
+//
+// When printing the objects after reading them from the database, NPE's are
+// generated because we don't yet have an enhancer...so the field references
+// to the other class, made in each class's toString() method, fail after
+// reading.  When we have an enhancer, these will be enhanced to be function
+// calls to get the field of the other class, and toString() will be invoked
+// in the result of that.
+//
+
+/**
+* Test 2 PC's that refer to each other in a cycle/loop.
+*
+* @author Dave Bristor
+*/
+public class Test_Cycle extends Test_Fetch {
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_Cycle.class);
+    }
+
+    // The idea is that we're going to write a bunch of stuff to a data
+    // output stream, then read it back in; we should get the same data
+    // back.
+    public void test() throws Exception {
+        insertObjects();
+        initExpected();
+        readObjects();
+        checkExtent(PCCycle.class, 1);
+        checkExtent(PCCycle2.class, 1);
+    }
+
+    // We override this from AbstractTest and insert our own objects 
+    protected void insertObjects() {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        Transaction tx = pm.currentTransaction();
+        try {
+            tx.begin();
+
+            PCCycle c = new PCCycle();
+            PCCycle2 c2 = new PCCycle2();
+
+            c.init("cyrcular", c2);
+            c2.init(12358, c);
+            
+            if (debug) {
+                logger.debug("Before insert: " + c);
+                logger.debug("Before insert: " + c2);
+            }
+            
+            pm.makePersistent(c);
+            pm.makePersistent(c2);
+            
+            tx.commit();
+        
+            Object oid_c = JDOHelper.getObjectId(c);
+            Object oid_c2 = JDOHelper.getObjectId(c2);
+            
+            if (debug) {
+                logger.debug("inserted c: " + oid_c);
+                logger.debug("inserted c2: " + oid_c2);
+            }
+            
+            oids.add(oid_c);
+            oids.add(oid_c2);
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+    
+    private PCCycle expectedC = null;
+    private PCCycle2 expectedC2 =null;
+
+    private void initExpected() {
+        expectedC = new PCCycle();
+        expectedC2 = new PCCycle2();
+        expectedC.init("cyrcular", expectedC2);
+        expectedC2.init(12358,  expectedC);
+    }
+
+    /**
+     * redefine verify called by readObjects to check whether the read
+     * instance is correct.
+     */
+    protected void verify(int i, Object pc) {
+        // PCCycle and PCCycle2 do not redefine equals, so use the string representation.
+        switch(i) {
+        case 0 : 
+            assertEquals("Wrong instance returned from datastore", expectedC.toString(), pc.toString());
+            break; 
+        case 1:
+            assertEquals("Wrong instance returned from datastore", expectedC2.toString(), pc.toString());
+            break;
+        default:
+            fail("Wrong number of inserted objects, expected two");
+            break;
+        }
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Delete.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Delete.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Delete.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_Delete.java Sun May 22 11:40:13 2005
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import java.io.EOFException;
+import java.io.ObjectInputStream;
+
+import javax.jdo.*;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+import org.apache.jdo.test.util.Factory;
+
+/**
+* This test is similar to Test_ActivateClass, but it adds extra steps of
+* getting OIDs for objects and deleting those objects.
+*
+* @author Dave Bristor
+*/
+public class Test_Delete extends AbstractTest {
+
+    /** */
+    private static boolean silent = false;
+    
+    /** */
+    public static void main(String args[]) {
+        handleArgs(args);
+        if (silent)
+            runSilentDelete();
+        else
+            JDORITestRunner.run(Test_Delete.class);
+    }
+
+    /** */
+    public void test() throws Exception {
+        if (!existing) {
+            insertObjects();
+            writeOIDs();
+        }
+        deleteObjects(false, false);
+        checkExtent(factory.getPCClass(), 0);
+    }
+
+    /** */
+    public void testOptimistic() throws Exception {
+        if (!existing) {
+            insertObjects();
+            writeOIDs();
+        }
+        deleteObjects(true, false);
+        checkExtent(factory.getPCClass(), 0);
+    }
+
+    /** */
+    public void testValidate() throws Exception {
+        if (!existing) {
+            insertObjects();
+            writeOIDs();
+        }
+        deleteObjects(false, true);
+        checkExtent(factory.getPCClass(), 0);
+    }
+
+    /** */
+    public void testOptimisticValidate() throws Exception {
+        if (!existing) {
+            insertObjects();
+            writeOIDs();
+        }
+        deleteObjects(true, true);
+        checkExtent(factory.getPCClass(), 0);
+    }
+
+    /** */
+    void deleteObjects(boolean optimistic, boolean validate) throws Exception {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        Transaction tx = pm.currentTransaction();
+
+        try {
+            ObjectInputStream in = getOIDFileInputStream();
+            tx.setOptimistic(optimistic);
+            tx.begin();
+            
+            try {
+                while (true) {
+                    Object pc = null;
+                    Object oid = in.readObject();
+                    if (debug) logger.debug("fetching: " + oid);
+                    pc = pm.getObjectById(oid, validate);
+                    if (debug) logger.debug("Before delete: " + pc);
+                    pm.deletePersistent(pc);
+                    assertTrue("IsDeleted", JDOHelper.isDeleted(pc));
+                }
+            } catch (EOFException ex) {
+                // OK
+            }
+            tx.commit();
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+
+    /** */
+    protected Factory getFactory(int verify) {
+        return getFactoryByClassProperty(verify, "org.apache.jdo.pc.PCPoint");
+    }
+
+    /** */
+    protected int getDefaultInsert()
+    {
+        return 5;
+    }
+
+    /** */
+    private static void runSilentDelete() {
+        try {
+            Test_Delete delete = new Test_Delete();
+            delete.setupPMF();
+            delete.test();
+            delete.closePMF();
+        }
+        catch (Exception ex) {
+            System.out.println("Excetion during delete");
+            ex.printStackTrace();
+        }
+    }
+
+    /** */
+    private static void handleArgs(String[] args) {
+        for (int i = 0; i < args.length; i++) {
+            if ("-silent".equals(args[i]))
+                silent = true;
+            else
+                System.err.println("Test_Delete: ignoring unknon option" + args[i]);
+        }
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_DupAppId.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_DupAppId.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_DupAppId.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_DupAppId.java Sun May 22 11:40:13 2005
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import javax.jdo.*;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+import org.apache.jdo.pc.PCPoint1;
+
+/**
+* Tests that FOStore can correctly determine dups for application identity.
+*
+* @author Marina Vatkina
+*/
+public class Test_DupAppId extends AbstractTest {
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_DupAppId.class);
+    }
+
+    /** */
+    public void test() {
+        insertObjects();
+        checkExtent(PCPoint1.class, 1);
+    }
+
+    /** */
+    public void insertObjects() {
+        PersistenceManager pm = pmf.getPersistenceManager();
+        Transaction tx = pm.currentTransaction();
+
+        try {
+            PCPoint1 p = new PCPoint1(1,10);
+            PCPoint1 p1 = new PCPoint1(1,100);
+            if (debug) logger.debug("INSERT");
+            tx.begin();
+            if (debug) logger.debug("Inserting: " + p);
+            pm.makePersistent(p);
+            try {
+                if (debug) logger.debug("Inserting: " + p1);
+                pm.makePersistent(p1);
+                fail("Missing JDOException during makePersistent with the same primary key in the PersistenceManager cache.");
+            } catch (JDOException ex) {
+                // expected exception => OK
+                if (debug) logger.debug("caught expected " + ex);
+            }
+            tx.commit(); tx = null;
+            
+            if (debug) {
+                logger.debug("Inserted: " + p);
+                logger.debug("P isPersistent: " + JDOHelper.isPersistent(p));
+            }
+            assertTrue("instance " + p + " + expected to be persistent", 
+                       JDOHelper.isPersistent(p));
+            if (debug) 
+                logger.debug("P1 isPersistent: " + JDOHelper.isPersistent(p1));
+            assertFalse("instance " + p1 + " + expected to be not persistent",
+                        JDOHelper.isPersistent(p1));
+            
+            pm.close(); pm = null;
+
+            pm = pmf.getPersistenceManager();
+            tx = pm.currentTransaction();
+            if (debug) logger.debug("INSERT DUPS");
+            tx.begin();
+            if (debug) logger.debug("Inserting: " + p1);
+            pm.makePersistent(p1);
+            try {
+                tx.commit(); 
+                fail("Missing JDOException during commit when inserting a duplicate in the datastore.");
+            } catch (Exception ex) {
+                // expected exception => OK
+                if (debug) logger.debug("caught expected " + ex);
+            }
+            if (debug) 
+                logger.debug("P1 isPersistent: " + JDOHelper.isPersistent(p1));
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDept.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDept.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDept.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDept.java Sun May 22 11:40:13 2005
@@ -0,0 +1,300 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import java.util.*;
+
+import javax.jdo.*;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+import org.apache.jdo.pc.PCDepartment;
+import org.apache.jdo.pc.PCEmployee;
+import org.apache.jdo.pc.PCInsurance;
+import org.apache.jdo.pc.PCProject;
+
+/**
+* Test a PC that has some fields which are PC's.
+*
+* @author Dave Bristor
+*/
+public class Test_EmpDept extends AbstractTest {
+    PCEmployee scott;
+    PCEmployee ed;
+
+    PCDepartment board;
+    PCDepartment emg;
+
+    PCInsurance scottIns;
+    PCInsurance edIns;
+
+    PCProject solaris;
+    PCProject sparc;
+
+    Object scottOid;
+    Object edOid;
+    Object boardOid;
+    Object emgOid;
+    Object scottInsOid;
+    Object edInsOid;
+    Object solarisOid;
+    Object sparcOid;
+
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_EmpDept.class);
+    }
+
+    /** */
+    public void test() throws Exception {
+        createObjects();
+        insertObjects();
+        readObjects();
+    }
+
+    // We override this from Test_ActivateClass and insert our own objects.
+    // Use Test_Extent to read them back.
+    protected void createObjects() {
+        HashSet h;
+        
+        // Create and set up employees.  Scott is Ed's manager.  Ed is
+        // Scott's sole employee.
+        //
+        GregorianCalendar born =
+            new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));
+        GregorianCalendar hired =
+            new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));
+
+        born.set(1969, 7, 20);
+        hired.set(1982, 5, 5);
+        scott = new PCEmployee(1L, "McNealy", "Scott", 200000.0,
+                               born.getTime(), hired.getTime());
+        born.set(1960, 4, 8);
+        hired.set(1985, 2, 3);
+        ed = new PCEmployee(100L, "Zander", "Ed", 400000.0,
+                            born.getTime(), hired.getTime());
+                           
+        ed.setManager(scott);
+
+        h = new HashSet();
+        h.add(ed);
+        scott.setEmployees(h);
+
+        // Set up their departments.
+        board = new PCDepartment(100L, "board");
+        h = new HashSet();
+        h.add(scott);
+        board.setEmployees(h);
+        scott.setDepartment(board);
+
+        emg = new PCDepartment(200L, "emg");
+        h = new HashSet();
+        h.add(ed);
+        emg.setEmployees(h);
+        ed.setDepartment(emg);
+
+        // Insure these guys
+        scottIns = new PCInsurance(1000, "Aetna", scott);
+        edIns = new PCInsurance(1001, "BlueCross", ed);
+        scott.setInsurance(scottIns);
+        ed.setInsurance(edIns);
+
+        // Give them some projects to work on.  Scott works on both; Ed only
+        // on one.
+        solaris = new PCProject(1L, "Solaris");
+        sparc = new PCProject(2L, "Sparc");
+        h = new HashSet();
+        h.add(scott);
+        h.add(ed);
+        solaris.setEmployees(h); // Solaris is worked on by Scott and Ed
+
+        h = new HashSet();
+        h.add(scott);
+        sparc.setEmployees(h); // Sparc is worked on by Scott
+        
+        h = new HashSet();
+        h.add(solaris);
+        h.add(sparc);
+        scott.setProjects(h); // Scott works on Solaris and Sparc
+
+        h = new HashSet();
+        h.add(solaris);
+        ed.setProjects(h); // Ed works on Solaris
+
+        // Show what we've got
+        if (debug) {
+            logger.debug("Before insert: ");
+            logger.debug(scott.toString());
+            logger.debug(ed.toString());
+            logger.debug(board.toString());
+            logger.debug(emg.toString());
+            logger.debug(scottIns.toString());
+            logger.debug(edIns.toString());
+            logger.debug(solaris.toString());
+            logger.debug(sparc.toString());
+        }
+    }
+
+    protected void insertObjects() throws Exception {
+        PersistenceManager pm = null;
+        Transaction tx = null;
+        try {
+            pm = pmf.getPersistenceManager();
+            tx = pm.currentTransaction();
+            tx.begin();
+
+            // Make it all persistent.  If reachability were implemented, we'd
+            // only have to make scott and ed persistent, as everything else is
+            // reachable from them.
+            pm.makePersistent(scott);
+            pm.makePersistent(ed);
+            pm.makePersistent(board);
+            pm.makePersistent(emg);
+            pm.makePersistent(scottIns);
+            pm.makePersistent(edIns);
+            pm.makePersistent(solaris);
+            pm.makePersistent(sparc);
+        
+            tx.commit();
+
+            scottOid = JDOHelper.getObjectId(scott);
+            edOid = JDOHelper.getObjectId(ed);
+            boardOid = JDOHelper.getObjectId(board);
+            emgOid = JDOHelper.getObjectId(emg);
+            scottInsOid = JDOHelper.getObjectId(scottIns);
+            edInsOid = JDOHelper.getObjectId(edIns);
+            solarisOid = JDOHelper.getObjectId(solaris);
+            sparcOid = JDOHelper.getObjectId(sparc);
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+
+    protected void readObjects() throws Exception {
+        PersistenceManager pm = null;
+        Transaction tx = null;
+        try {
+            pm = pmf.getPersistenceManager();
+            tx = pm.currentTransaction();
+            tx.begin();
+            if (debug) logger.debug("readObjects: ");
+            assertScott(pm.getObjectById(scottOid, true));
+            assertEd(pm.getObjectById(edOid, true));
+            assertBoard(pm.getObjectById(boardOid, true));
+            assertEmg(pm.getObjectById(emgOid, true));
+            assertScottIns(pm.getObjectById(scottInsOid, true));
+            assertEdIns(pm.getObjectById(edInsOid, true));
+            assertSolaris(pm.getObjectById(solarisOid, true));
+            assertSparc(pm.getObjectById(sparcOid, true));
+            tx.rollback();
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+        
+    }
+    
+    protected void assertScott(Object scott) {
+        assertNotNull("scott should not be null", scott); 
+        if (debug) logger.debug(scott.toString());
+        assertTrue("scott is expected to be a PCEmployee", 
+                   (scott instanceof PCEmployee));
+        assertEquals("Wrong string representation of scott", 
+                     "Emp: McNealy, Scott, id=1, born 20/Aug/1969, hired 5/Jun/1982 $200000.0 manager: none dept: board emps: 1 insurance: Aetna", 
+                     scott.toString());
+    }
+
+    protected void assertEd(Object ed) {
+        assertNotNull("ed should not be null", ed); 
+        if (debug) logger.debug(ed.toString());
+        assertTrue("ed is expected to be a PCEmployee", 
+                   (ed instanceof PCEmployee));
+        assertEquals("Wrong string representation of ed",
+                     "Emp: Zander, Ed, id=100, born 8/May/1960, hired 3/Mar/1985 $400000.0 manager: McNealy dept: emg emps: 0 insurance: BlueCross",
+                     ed.toString());
+    }
+
+    protected void assertBoard(Object board) {
+        assertNotNull("board should not be null", board); 
+        if (debug) logger.debug(board.toString());
+        assertTrue("board is expected to be a PCDepartment", 
+                   (board instanceof PCDepartment));
+        assertEquals("Wrong string representation of board",
+                     "Dept: board, id=100, emps: 1",
+                     board.toString());
+    }
+
+    protected void assertEmg(Object emg) {
+        assertNotNull("emg should not be null", emg); 
+        if (debug) logger.debug(emg.toString());
+        assertTrue("emg is expected to be a PCDepartment", 
+                   (emg instanceof PCDepartment));
+        assertEquals("Wrong string representation of emg",
+                     "Dept: emg, id=200, emps: 1",
+                     emg.toString());
+    }
+
+    protected void assertScottIns(Object scottIns) {
+        assertNotNull("scottIns should not be null", scottIns); 
+        if (debug) logger.debug(scottIns.toString());
+        assertTrue("scottIns is expected to be a PCInsurance", 
+                   (scottIns instanceof PCInsurance));
+        assertEquals("Wrong string representation of scotts insurance",
+                     "Ins: Aetna, id=1000, emp McNealy",
+                     scottIns.toString());
+    }
+
+    protected void assertEdIns(Object edIns) {
+        assertNotNull("edIns should not be null", edIns); 
+        if (debug) logger.debug(edIns.toString());
+        assertTrue("edIns is expected to be a PCInsurance", 
+                   (edIns instanceof PCInsurance));
+        assertEquals("Wrong string representation of eds insurance",
+                     "Ins: BlueCross, id=1001, emp Zander",
+                     edIns.toString());
+    }
+
+    protected void assertSolaris(Object solaris) {
+        assertNotNull("solaris should not be null", solaris); 
+        if (debug) logger.debug(solaris.toString());
+        assertTrue("solaris is expected to be a PCProject", 
+                   (solaris instanceof PCProject));
+        assertEquals("Wrong string representation of project solaris",
+                     "PCProject: Solaris, id=1, emps: 2",
+                     solaris.toString());
+    }
+
+    protected void assertSparc(Object sparc) {
+        assertNotNull("sparc should not be null", sparc); 
+        if (debug) logger.debug(sparc.toString());
+        assertTrue("sparc is expected to be a PCProject", 
+                   (sparc instanceof PCProject));
+        assertEquals("Wrong string representation of project sparc",
+                     "PCProject: Sparc, id=2, emps: 1",
+                     sparc.toString());
+    }
+    
+}
+

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDeptAppId.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDeptAppId.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDeptAppId.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDeptAppId.java Sun May 22 11:40:13 2005
@@ -0,0 +1,357 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+
+import java.util.*;
+
+import javax.jdo.*;
+
+import org.apache.jdo.test.util.AbstractTest;
+import org.apache.jdo.test.util.JDORITestRunner;
+
+import org.apache.jdo.pc.appid.PCDepartment;
+import org.apache.jdo.pc.appid.PCEmployee;
+import org.apache.jdo.pc.appid.PCFullTimeEmployee;
+import org.apache.jdo.pc.appid.PCInsurance;
+import org.apache.jdo.pc.appid.PCPartTimeEmployee;
+import org.apache.jdo.pc.appid.PCProject;
+
+/**
+* Test a PC that inherits from another PC with an application identity.
+*
+* @author Marina Vatkina
+*/
+public class Test_EmpDeptAppId extends AbstractTest {
+    
+    protected PersistenceManager pm;
+    protected Transaction tx;
+    protected String scottRepr = null;
+    
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_EmpDeptAppId.class);
+    }
+
+    /** */
+    public void test() throws Exception
+    {
+        insertObjects();
+        checkObjects();
+        updateObject();
+        checkObjects();
+        deleteObjects();
+    }    
+    
+    /** */
+    protected void insertObjects() {
+        try
+        {
+            pm = pmf.getPersistenceManager();
+            tx = pm.currentTransaction();
+            tx.begin();
+            createObjects();
+            tx.commit();
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+    
+    /** Check created objects by Extent and getObjectById.
+     */
+    protected void checkObjects() {
+        try {
+            pm = pmf.getPersistenceManager();
+            if (debug) logger.debug("EXTENT PCEmployee");
+            Extent ext = pm.getExtent(PCEmployee.class, true);
+            TreeMap elements = new TreeMap(); // Sort the results.
+            for (Iterator i = ext.iterator(); i.hasNext();) {
+                PCEmployee p = (PCEmployee)i.next();
+                elements.put(p.toString(), p);
+            }
+            
+            int count = 0;
+            for (Iterator i = elements.values().iterator(); i.hasNext();) {
+                Object p = i.next();
+                verify(count++, p);
+                loadAndVerifyObject(p, pm);
+            }
+        }
+        finally {
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+
+    /** Delete objects and check by getObjectById.
+     */
+    protected void deleteObjects() {
+        try {
+            pm = pmf.getPersistenceManager();
+            tx = pm.currentTransaction();
+            tx.begin();
+
+            if (debug) logger.debug("EXTENT PCEmployee");
+            Extent ext = pm.getExtent(PCEmployee.class, true);
+            TreeMap elements = new TreeMap(); // Sort the results.
+            for (Iterator i = ext.iterator(); i.hasNext();) {
+                PCEmployee p = (PCEmployee)i.next();
+                elements.put(p.toString(), p);
+            }
+            
+            for (Iterator i = elements.values().iterator(); i.hasNext();) {
+                Object p = i.next();
+                Object oid = pm.getObjectId(p);
+                if (debug) logger.debug("Delete with OID: " + oid);
+                pm.deletePersistent(p);
+                
+                Object o =  pm.getObjectById(oid, true);
+                assertSame("Expected same instance from getObjectById", p, o);
+                assertTrue("Instance should be deleted", JDOHelper.isDeleted(o));
+            }
+            tx.commit();
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+        checkExtent(PCEmployee.class, 0);
+    }
+
+    protected void createObjects() {
+        // Create and set up employees.  Scott is Ed's manager.  Ed is
+        // Scott's sole employee.
+        //
+        ArrayList arr;
+        
+        GregorianCalendar born =
+            new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));
+        GregorianCalendar hired =
+            new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));
+
+        born.set(1945, 5, 9);
+        hired.set(2001, 3, 5);
+        PCEmployee john = 
+            new PCEmployee( 
+                "John", "One", born.getTime(), 
+                900L, hired.getTime(),
+                null, null, null, null, null);
+                           
+        born.set(1969, 7, 20);
+        hired.set(1982, 5, 5);
+        PCEmployee scott =
+            new PCFullTimeEmployee(
+                "Scott", "McNealy", born.getTime(), 
+                1L, hired.getTime(),
+                200000.0);
+        born.set(1960, 4, 8);
+        hired.set(1985, 2, 3);
+        PCEmployee ed = 
+            new PCPartTimeEmployee(
+                "Ed", "Zander", born.getTime(), 
+                100L, hired.getTime(),
+                400000.0); 
+                           
+        ed.setManager(scott);
+
+        arr = new ArrayList();
+        arr.add(ed);
+        scott.setEmployees(arr);
+
+        // Set up their departments.
+        PCDepartment board =
+            new PCDepartment(100L, "board");
+        HashSet h = new HashSet();
+        h.add(scott);
+        board.setEmployees(h);
+        scott.setDepartment(board);
+
+        PCDepartment emg =
+            new PCDepartment(200L, "emg");
+        h = new HashSet();
+        h.add(ed);
+        emg.setEmployees(h);
+        ed.setDepartment(emg);
+        john.setDepartment(emg);
+
+        // Insure these guys
+        PCInsurance scottIns = new PCInsurance(1000, "Aetna", scott);
+        PCInsurance edIns = new PCInsurance(1001, "BlueCross", ed);
+        scott.setInsurance(scottIns);
+        ed.setInsurance(edIns);
+        PCInsurance johnIns = new PCInsurance(9001, "BlueCross", john);
+        john.setInsurance(johnIns);
+
+        // Give them some projects to work on.  Scott works on both; Ed only
+        // on one.
+        PCProject solaris = new PCProject(1L, "Solaris");
+        PCProject sparc = new PCProject(2L, "Sparc");
+        h = new HashSet();
+        h.add(scott);
+        h.add(ed);
+        solaris.setEmployees(h); // Solaris is worked on by Scott and Ed
+
+        h = new HashSet();
+        h.add(scott);
+        sparc.setEmployees(h); // Sparc is worked on by Scott
+        
+        arr = new ArrayList();
+        arr.add(solaris);
+        arr.add(sparc);
+        scott.setProjects(arr); // Scott works on Solaris and Sparc
+
+        arr = new ArrayList();
+        arr.add(solaris);
+        ed.setProjects(arr); // Ed works on Solaris
+
+        // Show what we've got
+        if (debug) {
+            logger.debug("Before insert: ");
+            logger.debug(scott.toString());
+            logger.debug(ed.toString());
+            logger.debug(john.toString());
+            logger.debug(board.toString());
+            logger.debug(emg.toString());
+            logger.debug(scottIns.toString());
+            logger.debug(edIns.toString());
+            logger.debug(johnIns.toString());
+            logger.debug(solaris.toString());
+            logger.debug(sparc.toString());
+        }
+
+        // Make it all persistent.  If reachability were implemented, we'd
+        // only have to make scott and ed persistent, as everything else is
+        // reachable from them.
+        pm.makePersistent(scott);
+        pm.makePersistent(ed);
+        pm.makePersistent(john);
+
+        Object oid = pm.getObjectId(scott);
+        if (debug) logger.debug("Instance OID for scott: " + oid);
+        Object o =  pm.getObjectById(oid, true);
+        assertSame("getObjectById should return the same instance", scott, o); 
+
+        oid = pm.getObjectId(ed);
+        if (debug) logger.debug("Instance OID for ed: " + oid);
+        o =  pm.getObjectById(oid, true);
+        assertSame("getObjectById should return the same instance", ed, o); 
+
+        oid = pm.getObjectId(john);
+        if (debug) logger.debug("Instance OID for john: " + oid);
+        o =  pm.getObjectById(oid, true);
+        assertSame("getObjectById should return the same instance", john, o); 
+
+        scottRepr = "PCFullTimeEmployee: PCEmployee: PCPerson: McNealy, Scott, born 20/Aug/1969, id=1, hired 5/Jun/1982 manager: none dept: board emps: 1 insurance: Aetna $200000.0";
+    }
+        
+   /** Check created objects by Extent and getObjectById.
+     */
+    protected void updateObject() {
+        try {
+            pm = pmf.getPersistenceManager();
+            tx = pm.currentTransaction();
+            tx.begin();
+            String s = "1"; 
+            Object oid = pm.newObjectIdInstance(PCEmployee.class, s);
+            if (debug)
+                logger.debug("GOT OID: " + oid.getClass().getName() +
+                             " value: " + oid);
+            PCEmployee p = (PCEmployee)pm.getObjectById(oid, true);
+            if (debug) logger.debug("GOT INSTANCE TO UPDATE: " + p);
+
+            GregorianCalendar date =
+                new GregorianCalendar(TimeZone.getTimeZone("America/New_York"));
+            date.set(1999, 7, 9);
+
+            p.setHiredate(date.getTime());
+            tx.commit();
+            
+            oid = pm.getObjectId(p);
+            Object o = pm.getObjectById(oid, true);
+            if (debug) logger.debug("GOT INSTANCE AFTER COMMIT: " + o);
+            assertSame("Expected to get same instance", p, o);
+            scottRepr = "PCFullTimeEmployee: PCEmployee: PCPerson: McNealy, Scott, born 20/Aug/1969, id=1, hired 9/Aug/1999 manager: none dept: board emps: 1 insurance: Aetna $200000.0";
+            assertEquals("Wrong string represenatation of updated instance scott", 
+                         scottRepr, o.toString());
+        }
+        finally {
+            if (tx != null && tx.isActive())
+                tx.rollback();
+            if (pm != null && !pm.isClosed())
+                pm.close();
+        }
+    }
+    
+    protected void loadAndVerifyObject(Object obj, PersistenceManager pm) {
+        Object oid = pm.getObjectId(obj);
+        if (debug) logger.debug("Instance OID: " + oid);
+        
+        PersistenceManager pm1 = null;
+        try {
+            pm1 = pmf.getPersistenceManager();
+            Object obj1 =  pm1.getObjectById(oid, true);
+            if (debug) logger.debug("Instance from OID: " + obj1);
+            assertEquals("Wrong string represenatation of loaded instance",
+                         obj.toString(), obj1.toString());
+            Object oid1 = pm1.getObjectId(obj1);
+            if (debug) logger.debug("OID from instance: " + oid1);
+            assertEquals("OID from instance not equal", oid, oid1);
+            Object obj2 =  pm1.getObjectById(oid, true);
+            assertSame("Same instance from getObjectById", obj1, obj2);
+        }
+        finally {
+            if (pm1 != null && !pm1.isClosed())
+                pm1.close();
+        }
+    }
+
+    /** */
+    protected void verify(int i, Object pc) {
+        if (debug) logger.debug("verify " + pc);
+        Object oid = JDOHelper.getObjectId(pc);
+        switch(i) {
+        case 0 :
+            // should be John
+            assertEquals("Unexpected string represenatation of John", 
+                         "PCEmployee: PCPerson: One, John, born 9/Jun/1945, id=900, hired 5/Apr/2001 manager: none dept: emg emps: 0 insurance: BlueCross", 
+                         pc.toString());
+            assertEquals("Unexpected oid", new PCEmployee.Oid("900"), oid);
+            break; 
+        case 1:
+            // should be Scott
+            assertEquals("Unexpected string represenatation of Scott", scottRepr, pc.toString());
+            assertEquals("Unexpected oid", new PCEmployee.Oid("1"), oid);
+            break;
+        case 2:
+            // should be Ed
+            assertEquals("Unexpected string represenatation of Ed", 
+                         "PCPartTimeEmployee: PCEmployee: PCPerson: Zander, Ed, born 8/May/1960, id=100, hired 3/Mar/1985 manager: McNealy dept: emg emps: 0 insurance: BlueCross $400000.0", 
+                         pc.toString());
+            assertEquals("Unexpected oid", new PCEmployee.Oid("100"), oid);
+            break;
+        default:
+            fail("Wrong number of inserted objects, expected three");
+            break;
+        }
+    }
+}

Added: incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDeptAppIdDelete.java
URL: http://svn.apache.org/viewcvs/incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDeptAppIdDelete.java?rev=171355&view=auto
==============================================================================
--- incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDeptAppIdDelete.java (added)
+++ incubator/jdo/trunk/fostore20/test/java/org/apache/jdo/test/Test_EmpDeptAppIdDelete.java Sun May 22 11:40:13 2005
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at 
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software 
+ * distributed under the License is distributed on an "AS IS" BASIS, 
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+ * See the License for the specific language governing permissions and 
+ * limitations under the License.
+ */
+
+package org.apache.jdo.test;
+
+import org.apache.jdo.test.util.JDORITestRunner;
+
+/**
+* Test a PC that inherits from another PC with an application identity.
+*
+* @author Marina Vatkina
+*/
+public class Test_EmpDeptAppIdDelete extends Test_EmpDeptAppId {
+    
+    /** */
+    public static void main(String args[]) {
+        JDORITestRunner.run(Test_EmpDeptAppIdDelete.class);
+    }
+
+    /** */
+    public void test() throws Exception 
+    {
+        deleteObjects();
+    }    
+
+}