You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/11/02 08:39:01 UTC

[5/8] Rename Integration Tests in cayenne-client (*IT.java instead of *Test.java)

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextTest.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextTest.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextTest.java
deleted file mode 100644
index 405036e..0000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextTest.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.event.DefaultEventManager;
-import org.apache.cayenne.event.EventManager;
-import org.apache.cayenne.event.MockEventManager;
-import org.apache.cayenne.graph.CompoundDiff;
-import org.apache.cayenne.graph.GraphDiff;
-import org.apache.cayenne.graph.MockGraphDiff;
-import org.apache.cayenne.graph.NodeIdChangeOperation;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.query.Query;
-import org.apache.cayenne.remote.BootstrapMessage;
-import org.apache.cayenne.remote.ClientChannel;
-import org.apache.cayenne.remote.ClientConnection;
-import org.apache.cayenne.remote.ClientMessage;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.util.GenericResponse;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextTest extends ClientCase {
-
-    @Inject
-    private ObjectContext serverContext;
-
-    public void testConstructor() {
-
-        CayenneContext context = new CayenneContext();
-
-        // test default property parameters
-        assertNotNull(context.getGraphManager());
-        assertNull(context.channel);
-
-        MockDataChannel channel = new MockDataChannel();
-        context.setChannel(channel);
-        assertSame(channel, context.getChannel());
-    }
-
-    public void testChannel() {
-        MockDataChannel channel = new MockDataChannel();
-        CayenneContext context = new CayenneContext(channel);
-
-        assertSame(channel, context.getChannel());
-    }
-
-    public void testCommitUnchanged() {
-
-        MockDataChannel channel = new MockDataChannel();
-        CayenneContext context = new CayenneContext(channel);
-
-        // no context changes so no connector access is expected
-        context.commitChanges();
-        assertTrue(channel.getRequestObjects().isEmpty());
-    }
-
-    public void testCommitCommandExecuted() {
-
-        MockDataChannel channel = new MockDataChannel(new MockGraphDiff());
-        channel.setEntityResolver(serverContext
-                .getEntityResolver()
-                .getClientEntityResolver());
-        CayenneContext context = new CayenneContext(channel);
-
-        // test that a command is being sent via connector on commit...
-
-        context.internalGraphManager().nodePropertyChanged(
-                new ObjectId("MtTable1"),
-                "x",
-                "y",
-                "z");
-
-        context.commitChanges();
-        assertEquals(1, channel.getRequestObjects().size());
-
-        // expect a sync/commit chain
-        Object mainMessage = channel.getRequestObjects().iterator().next();
-        assertTrue(mainMessage instanceof GraphDiff);
-    }
-
-    public void testCommitChangesNew() {
-        final CompoundDiff diff = new CompoundDiff();
-        final Object newObjectId = new ObjectId("test", "key", "generated");
-        final EventManager eventManager = new DefaultEventManager(0);
-
-        // test that ids that are passed back are actually propagated to the right
-        // objects...
-
-        MockDataChannel channel = new MockDataChannel() {
-
-            @Override
-            public GraphDiff onSync(
-                    ObjectContext originatingContext,
-                    GraphDiff changes,
-                    int syncType) {
-
-                return diff;
-            }
-
-            // must provide a channel with working event manager
-            @Override
-            public EventManager getEventManager() {
-                return eventManager;
-            }
-        };
-
-        CayenneContext context = new CayenneContext(channel);
-        ObjEntity entity = new ObjEntity("test_entity");
-        entity.setClassName(MockPersistentObject.class.getName());
-
-        DataMap dataMap = new DataMap("test");
-        dataMap.addObjEntity(entity);
-        Collection<DataMap> entities = Collections.singleton(dataMap);
-        context.setEntityResolver(new EntityResolver(entities));
-        Persistent object = context.newObject(MockPersistentObject.class);
-
-        // record change here to make it available to the anonymous connector method..
-        diff.add(new NodeIdChangeOperation(object.getObjectId(), newObjectId));
-
-        // check that a generated object ID is assigned back to the object...
-        assertNotSame(newObjectId, object.getObjectId());
-        context.commitChanges();
-        assertSame(newObjectId, object.getObjectId());
-        assertSame(object, context.graphManager.getNode(newObjectId));
-    }
-
-    public void testNewObject() {
-
-        CayenneContext context = new CayenneContext(new MockDataChannel());
-
-        ObjEntity entity = new ObjEntity("test_entity");
-        entity.setClassName(MockPersistentObject.class.getName());
-
-        DataMap dataMap = new DataMap("test");
-        dataMap.addObjEntity(entity);
-        Collection<DataMap> entities = Collections.singleton(dataMap);
-        context.setEntityResolver(new EntityResolver(entities));
-
-        Persistent object = context.newObject(MockPersistentObject.class);
-        assertNotNull(object);
-        assertTrue(object instanceof MockPersistentObject);
-        assertEquals(PersistenceState.NEW, object.getPersistenceState());
-        assertSame(context, object.getObjectContext());
-        assertTrue(context
-                .internalGraphManager()
-                .dirtyNodes(PersistenceState.NEW)
-                .contains(object));
-        assertNotNull(object.getObjectId());
-        assertTrue(object.getObjectId().isTemporary());
-    }
-
-    public void testDeleteObject() {
-
-        CayenneContext context = new CayenneContext(new MockDataChannel());
-        ObjEntity entity = new ObjEntity("test_entity");
-        entity.setClassName(MockPersistentObject.class.getName());
-
-        DataMap dataMap = new DataMap("test");
-        dataMap.addObjEntity(entity);
-        Collection<DataMap> entities = Collections.singleton(dataMap);
-        context.setEntityResolver(new EntityResolver(entities));
-
-        // TRANSIENT ... should quietly ignore it
-        Persistent transientObject = new MockPersistentObject();
-        context.deleteObjects(transientObject);
-        assertEquals(PersistenceState.TRANSIENT, transientObject.getPersistenceState());
-
-        // NEW ... should make it TRANSIENT
-        // create via context to make sure that object store would register it
-        Persistent newObject = context.newObject(MockPersistentObject.class);
-        assertNotNull(newObject.getObjectContext());
-        context.deleteObjects(newObject);
-        assertNull(newObject.getObjectContext());
-        assertEquals(PersistenceState.TRANSIENT, newObject.getPersistenceState());
-        assertFalse(context
-                .internalGraphManager()
-                .dirtyNodes()
-                .contains(newObject.getObjectId()));
-
-        // see CAY-547 for details...
-        assertFalse(context.internalGraphManager().dirtyNodes().contains(null));
-
-        // COMMITTED
-        Persistent committed = new MockPersistentObject();
-        committed.setPersistenceState(PersistenceState.COMMITTED);
-        committed.setObjectId(new ObjectId("test_entity", "key", "value1"));
-        committed.setObjectContext(context);
-        context.deleteObjects(committed);
-        assertEquals(PersistenceState.DELETED, committed.getPersistenceState());
-
-        // MODIFIED
-        Persistent modified = new MockPersistentObject();
-        modified.setPersistenceState(PersistenceState.MODIFIED);
-        modified.setObjectId(new ObjectId("test_entity", "key", "value2"));
-        modified.setObjectContext(context);
-        context.deleteObjects(modified);
-        assertEquals(PersistenceState.DELETED, modified.getPersistenceState());
-
-        // DELETED
-        Persistent deleted = new MockPersistentObject();
-        deleted.setPersistenceState(PersistenceState.DELETED);
-        deleted.setObjectId(new ObjectId("test_entity", "key", "value3"));
-        deleted.setObjectContext(context);
-        context.deleteObjects(deleted);
-        assertEquals(PersistenceState.DELETED, committed.getPersistenceState());
-    }
-
-    public void testBeforePropertyReadShouldInflateHollow() {
-
-        ObjectId gid = new ObjectId("MtTable1", "a", "b");
-        final ClientMtTable1 inflated = new ClientMtTable1();
-        inflated.setPersistenceState(PersistenceState.COMMITTED);
-        inflated.setObjectId(gid);
-        inflated.setGlobalAttribute1("abc");
-
-        ClientConnection connection = mock(ClientConnection.class);
-        when(connection.sendMessage((ClientMessage) any())).thenAnswer(
-                new Answer<Object>() {
-
-                    public Object answer(InvocationOnMock invocation) {
-                        ClientMessage arg = (ClientMessage) invocation.getArguments()[0];
-
-                        if (arg instanceof BootstrapMessage) {
-                            return new EntityResolver();
-                        }
-                        else {
-                            return new GenericResponse(Arrays.asList(inflated));
-                        }
-                    }
-                });
-
-        ClientChannel channel = new ClientChannel(
-                connection,
-                false,
-                new MockEventManager(),
-                false);
-
-        // check that a HOLLOW object is infalted on "beforePropertyRead"
-        ClientMtTable1 hollow = new ClientMtTable1();
-        hollow.setPersistenceState(PersistenceState.HOLLOW);
-        hollow.setObjectId(gid);
-
-        final boolean[] selectExecuted = new boolean[1];
-        CayenneContext context = new CayenneContext(channel) {
-
-            @Override
-            public List<?> performQuery(Query query) {
-                selectExecuted[0] = true;
-                return super.performQuery(query);
-            }
-        };
-
-        context.setEntityResolver(serverContext
-                .getEntityResolver()
-                .getClientEntityResolver());
-
-        context.graphManager.registerNode(hollow.getObjectId(), hollow);
-
-        // testing this...
-        context
-                .prepareForAccess(
-                        hollow,
-                        ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY,
-                        false);
-        assertTrue(selectExecuted[0]);
-        assertSame(hollow, context.getGraphManager().getNode(gid));
-        assertEquals(
-                inflated.getGlobalAttribute1Direct(),
-                hollow.getGlobalAttribute1Direct());
-        assertEquals(PersistenceState.COMMITTED, hollow.getPersistenceState());
-    }
-
-    public void testBeforeHollowDeleteShouldChangeStateToCommited() {
-
-        ObjectId gid = new ObjectId("MtTable1", "a", "b");
-        final ClientMtTable1 inflated = new ClientMtTable1();
-        inflated.setPersistenceState(PersistenceState.COMMITTED);
-        inflated.setObjectId(gid);
-        inflated.setGlobalAttribute1("abc");
-
-        ClientConnection connection = mock(ClientConnection.class);
-        when(connection.sendMessage((ClientMessage) any())).thenAnswer(
-                new Answer<Object>() {
-
-                    public Object answer(InvocationOnMock invocation) {
-                        ClientMessage arg = (ClientMessage) invocation.getArguments()[0];
-
-                        if (arg instanceof BootstrapMessage) {
-                            return new EntityResolver();
-                        }
-                        else {
-                            return new GenericResponse(Arrays.asList(inflated));
-                        }
-                    }
-                });
-        ClientChannel channel = new ClientChannel(
-                connection,
-                false,
-                new MockEventManager(),
-                false);
-
-        CayenneContext context = new CayenneContext(channel);
-        context.setEntityResolver(serverContext
-                .getEntityResolver()
-                .getClientEntityResolver());
-        ClientMtTable1 hollow = context.localObject(inflated);
-        assertEquals(PersistenceState.HOLLOW, hollow.getPersistenceState());
-
-        // testing this...
-        context.deleteObjects(hollow);
-        assertSame(hollow, context.getGraphManager().getNode(gid));
-        assertEquals(
-                inflated.getGlobalAttribute1Direct(),
-                hollow.getGlobalAttribute1Direct());
-        assertEquals(PersistenceState.DELETED, hollow.getPersistenceState());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationIT.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationIT.java
new file mode 100644
index 0000000..f8e3c78
--- /dev/null
+++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationIT.java
@@ -0,0 +1,89 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.apache.cayenne.validation.ValidationException;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextValidationIT extends ClientCase {
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Inject
+    private CayenneContext context;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+    }
+
+    public void testValidate() throws Exception {
+
+        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
+        o1.setGlobalAttribute1("G1");
+        o1.resetValidation(false);
+
+        // this one is not validating
+        ClientMtTable2 o2 = context.newObject(ClientMtTable2.class);
+        o2.setTable1(o1);
+
+        context.commitChanges();
+        assertTrue(o1.isValidatedForInsert());
+        assertFalse(o1.isValidatedForDelete());
+        assertFalse(o1.isValidatedForUpdate());
+
+        o1.resetValidation(false);
+        o1.setGlobalAttribute1("G2");
+
+        context.commitChanges();
+        assertFalse(o1.isValidatedForInsert());
+        assertFalse(o1.isValidatedForDelete());
+        assertTrue(o1.isValidatedForUpdate());
+
+        o1.resetValidation(false);
+        context.deleteObjects(o1);
+        context.deleteObjects(o2);
+
+        context.commitChanges();
+        assertFalse(o1.isValidatedForInsert());
+        assertTrue(o1.isValidatedForDelete());
+        assertFalse(o1.isValidatedForUpdate());
+
+        ClientMtTable1 o11 = context.newObject(ClientMtTable1.class);
+        o11.setGlobalAttribute1("G1");
+        o11.resetValidation(true);
+
+        try {
+            context.commitChanges();
+            fail("Validation failure must have prevented commit");
+        }
+        catch (ValidationException e) {
+            // expected
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationTest.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationTest.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationTest.java
deleted file mode 100644
index fcac894..0000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextValidationTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.apache.cayenne.validation.ValidationException;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextValidationTest extends ClientCase {
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject
-    private CayenneContext context;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-    }
-
-    public void testValidate() throws Exception {
-
-        ClientMtTable1 o1 = context.newObject(ClientMtTable1.class);
-        o1.setGlobalAttribute1("G1");
-        o1.resetValidation(false);
-
-        // this one is not validating
-        ClientMtTable2 o2 = context.newObject(ClientMtTable2.class);
-        o2.setTable1(o1);
-
-        context.commitChanges();
-        assertTrue(o1.isValidatedForInsert());
-        assertFalse(o1.isValidatedForDelete());
-        assertFalse(o1.isValidatedForUpdate());
-
-        o1.resetValidation(false);
-        o1.setGlobalAttribute1("G2");
-
-        context.commitChanges();
-        assertFalse(o1.isValidatedForInsert());
-        assertFalse(o1.isValidatedForDelete());
-        assertTrue(o1.isValidatedForUpdate());
-
-        o1.resetValidation(false);
-        context.deleteObjects(o1);
-        context.deleteObjects(o2);
-
-        context.commitChanges();
-        assertFalse(o1.isValidatedForInsert());
-        assertTrue(o1.isValidatedForDelete());
-        assertFalse(o1.isValidatedForUpdate());
-
-        ClientMtTable1 o11 = context.newObject(ClientMtTable1.class);
-        o11.setGlobalAttribute1("G1");
-        o11.resetValidation(true);
-
-        try {
-            context.commitChanges();
-            fail("Validation failure must have prevented commit");
-        }
-        catch (ValidationException e) {
-            // expected
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextIT.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextIT.java
new file mode 100644
index 0000000..a5cf087
--- /dev/null
+++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextIT.java
@@ -0,0 +1,570 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne;
+
+import java.sql.Types;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.cayenne.access.ClientServerChannel;
+import org.apache.cayenne.access.DataContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.LifecycleEvent;
+import org.apache.cayenne.query.ObjectIdQuery;
+import org.apache.cayenne.query.QueryCacheStrategy;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.SortOrder;
+import org.apache.cayenne.reflect.LifecycleCallbackRegistry;
+import org.apache.cayenne.remote.RemoteIncrementalFaultList;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.test.parallel.ParallelTestContainer;
+import org.apache.cayenne.testdo.mt.ClientMtMeaningfulPk;
+import org.apache.cayenne.testdo.mt.ClientMtReflexive;
+import org.apache.cayenne.testdo.mt.ClientMtTable1;
+import org.apache.cayenne.testdo.mt.ClientMtTable2;
+import org.apache.cayenne.testdo.mt.MtReflexive;
+import org.apache.cayenne.testdo.mt.MtTable1;
+import org.apache.cayenne.unit.di.DataChannelInterceptor;
+import org.apache.cayenne.unit.di.UnitTestClosure;
+import org.apache.cayenne.unit.di.client.ClientCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
+public class CayenneContextWithDataContextIT extends ClientCase {
+
+    @Inject
+    private CayenneContext clientContext;
+
+    @Inject
+    private DBHelper dbHelper;
+
+    @Inject(ClientCase.ROP_CLIENT_KEY)
+    private DataChannelInterceptor clientServerInterceptor;
+
+    @Inject
+    private ClientServerChannel clientServerChannel;
+
+    private TableHelper tMtTable1;
+    private TableHelper tMtTable2;
+
+    private TableHelper tMtMeaningfulPK;
+
+    @Override
+    protected void setUpAfterInjection() throws Exception {
+        dbHelper.deleteAll("MT_TABLE2");
+        dbHelper.deleteAll("MT_TABLE1");
+
+        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
+        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", "SERVER_ATTRIBUTE1");
+
+        tMtTable2 = new TableHelper(dbHelper, "MT_TABLE2");
+        tMtTable2.setColumns("TABLE2_ID", "TABLE1_ID", "GLOBAL_ATTRIBUTE").setColumnTypes(
+                Types.INTEGER, Types.INTEGER, Types.VARCHAR);
+
+        tMtMeaningfulPK = new TableHelper(dbHelper, "MT_MEANINGFUL_PK");
+        tMtMeaningfulPK.setColumns("PK");
+    }
+
+    private void deleteAndCreateTwoMeaningfulPKsDataSet() throws Exception {
+        tMtMeaningfulPK.deleteAll();
+        tMtMeaningfulPK.insert("A");
+        tMtMeaningfulPK.insert("B");
+    }
+
+    private void createTwoMtTable1sAnd2sDataSet() throws Exception {
+        tMtTable1.insert(1, "g1", "s1");
+        tMtTable1.insert(2, "g2", "s2");
+
+        tMtTable2.insert(1, 1, "g1");
+        tMtTable2.insert(2, 1, "g2");
+    }
+
+    private void createEightMtTable1s() throws Exception {
+        for (int i = 1; i <= 8; i++) {
+            tMtTable1.insert(i, "g" + i, "s" + i);
+        }
+    }
+
+    public void testLocalCacheStaysLocal() {
+
+        DataContext serverContext = (DataContext) clientServerChannel.getParentChannel();
+
+        SelectQuery query = new SelectQuery(ClientMtTable1.class);
+        query.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
+
+        assertEquals(0, clientContext.getQueryCache().size());
+        assertEquals(0, serverContext.getQueryCache().size());
+
+        List<?> results = clientContext.performQuery(query);
+
+        assertEquals(1, clientContext.getQueryCache().size());
+        assertSame(results, clientContext.getQueryCache().get(
+                query.getMetaData(clientContext.getEntityResolver())));
+
+        assertEquals(0, serverContext.getQueryCache().size());
+    }
+
+    public void testAddToList() throws Exception {
+
+        ClientMtTable1 t1 = clientContext.newObject(ClientMtTable1.class);
+        ClientMtTable2 t2 = clientContext.newObject(ClientMtTable2.class);
+
+        t1.addToTable2Array(t2);
+        assertEquals(1, t1.getTable2Array().size());
+        assertSame(t1, t2.getTable1());
+
+        // do it again to make sure action can handle series of changes
+        ClientMtTable1 t3 = clientContext.newObject(ClientMtTable1.class);
+        ClientMtTable2 t4 = clientContext.newObject(ClientMtTable2.class);
+
+        t3.addToTable2Array(t4);
+        assertEquals(1, t3.getTable2Array().size());
+        assertSame(t3, t4.getTable1());
+    }
+
+    public void testSetValueHolder() throws Exception {
+
+        ClientMtTable1 t1 = clientContext.newObject(ClientMtTable1.class);
+        ClientMtTable2 t2 = clientContext.newObject(ClientMtTable2.class);
+
+        t2.setTable1(t1);
+        assertEquals(1, t1.getTable2Array().size());
+        assertSame(t1, t2.getTable1());
+    }
+
+    public void testPostAddCallback() throws Exception {
+
+        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
+                .getEntityResolver()
+                .getCallbackRegistry();
+
+        final boolean[] flag = new boolean[1];
+
+        try {
+            callbackRegistry.addListener(MtTable1.class, new LifecycleListener() {
+
+                public void postLoad(Object entity) {
+                }
+
+                public void postPersist(Object entity) {
+                }
+
+                public void postRemove(Object entity) {
+                }
+
+                public void postUpdate(Object entity) {
+                }
+
+                public void postAdd(Object entity) {
+                    flag[0] = true;
+                }
+
+                public void preRemove(Object entity) {
+                }
+
+                public void preUpdate(Object entity) {
+                }
+
+                public void prePersist(Object entity) {
+                }
+            });
+
+            clientContext.newObject(ClientMtTable1.class);
+
+            assertFalse(flag[0]);
+            clientContext.commitChanges();
+            assertTrue(flag[0]);
+        }
+        finally {
+            callbackRegistry.clear();
+        }
+    }
+
+    public void testPostAddOnObjectCallback() throws Exception {
+
+        final DataContext serverContext = (DataContext) clientServerChannel.getParentChannel();
+
+        LifecycleCallbackRegistry callbackRegistry = serverContext
+                .getEntityResolver()
+                .getCallbackRegistry();
+
+        try {
+            callbackRegistry.addCallback(
+                    LifecycleEvent.POST_ADD,
+                    MtTable1.class,
+                    "prePersistMethod");
+
+            final Persistent clientObject = clientContext.newObject(ClientMtTable1.class);
+            clientContext.commitChanges();
+
+        new ParallelTestContainer() {
+
+            @Override
+            protected void assertResult() throws Exception {
+            	// find peer
+            	MtTable1 peer = (MtTable1) serverContext.getGraphManager().getNode(
+                    clientObject.getObjectId());
+
+            	assertNotNull(peer);
+            	assertTrue(peer.isPrePersisted());
+            }
+        }.runTest(1000);
+
+
+        }
+        finally {
+            callbackRegistry.clear();
+        }
+    }
+
+    public void testPreRemoveCallback() throws Exception {
+
+        // an exception was triggered within POST_LOAD callback
+        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
+                .getEntityResolver()
+                .getCallbackRegistry();
+
+        final boolean[] flag = new boolean[1];
+
+        try {
+            callbackRegistry.addListener(MtTable1.class, new LifecycleListener() {
+
+                public void postLoad(Object entity) {
+                }
+
+                public void postPersist(Object entity) {
+                }
+
+                public void postRemove(Object entity) {
+                }
+
+                public void postUpdate(Object entity) {
+                }
+
+                public void postAdd(Object entity) {
+                }
+
+                public void preRemove(Object entity) {
+                    flag[0] = true;
+                }
+
+                public void preUpdate(Object entity) {
+                }
+
+                public void prePersist(Object entity) {
+                }
+            });
+
+            ClientMtTable1 object = clientContext.newObject(ClientMtTable1.class);
+
+            assertFalse(flag[0]);
+            clientContext.commitChanges();
+            assertFalse(flag[0]);
+
+            clientContext.deleteObjects(object);
+            clientContext.commitChanges();
+            assertTrue(flag[0]);
+        }
+        finally {
+            callbackRegistry.clear();
+        }
+    }
+
+    public void testCAY830() throws Exception {
+
+        // an exception was triggered within POST_LOAD callback
+        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
+                .getEntityResolver()
+                .getCallbackRegistry();
+
+        try {
+            callbackRegistry.addListener(MtReflexive.class, new LifecycleListener() {
+
+                public void postLoad(Object entity) {
+                }
+
+                public void postPersist(Object entity) {
+                }
+
+                public void postRemove(Object entity) {
+                }
+
+                public void postUpdate(Object entity) {
+                }
+
+                public void postAdd(Object entity) {
+                }
+
+                public void preRemove(Object entity) {
+                }
+
+                public void preUpdate(Object entity) {
+                }
+
+                public void prePersist(Object entity) {
+                }
+            });
+
+            ClientMtReflexive o1 = clientContext.newObject(ClientMtReflexive.class);
+            o1.setName("parent");
+
+            ClientMtReflexive o2 = clientContext.newObject(ClientMtReflexive.class);
+            o2.setName("child");
+            o2.setToParent(o1);
+            clientContext.commitChanges();
+
+            clientContext.deleteObjects(o1);
+            clientContext.deleteObjects(o2);
+            clientContext.commitChanges();
+            // per CAY-830 an exception is thrown here
+        }
+        finally {
+            callbackRegistry.clear();
+        }
+    }
+
+    public void testRollbackChanges() throws Exception {
+
+        ClientMtTable1 o = clientContext.newObject(ClientMtTable1.class);
+        o.setGlobalAttribute1("1");
+        clientContext.commitChanges();
+
+        assertEquals("1", o.getGlobalAttribute1());
+        o.setGlobalAttribute1("2");
+        assertEquals("2", o.getGlobalAttribute1());
+        clientContext.rollbackChanges();
+
+        assertEquals("1", o.getGlobalAttribute1());
+        assertTrue(clientContext.modifiedObjects().isEmpty());
+    }
+
+    public void testCreateFault() throws Exception {
+        tMtTable1.insert(1, "g1", "s1");
+
+        ObjectId id = new ObjectId("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 1);
+
+        Object fault = clientContext.createFault(id);
+        assertTrue(fault instanceof ClientMtTable1);
+
+        ClientMtTable1 o = (ClientMtTable1) fault;
+        assertEquals(PersistenceState.HOLLOW, o.getPersistenceState());
+        assertSame(clientContext, o.getObjectContext());
+        assertNull(o.getGlobalAttribute1Direct());
+
+        // make sure we haven't tripped the fault yet
+        assertEquals(PersistenceState.HOLLOW, o.getPersistenceState());
+
+        // try tripping fault
+        assertEquals("g1", o.getGlobalAttribute1());
+        assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
+    }
+
+    public void testCreateBadFault() throws Exception {
+        tMtTable1.insert(1, "g1", "s1");
+
+        ObjectId id = new ObjectId("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 2);
+
+        Object fault = clientContext.createFault(id);
+        assertTrue(fault instanceof ClientMtTable1);
+
+        ClientMtTable1 o = (ClientMtTable1) fault;
+
+        // try tripping fault
+        try {
+            o.getGlobalAttribute1();
+            fail("resolving bad fault should've thrown");
+        }
+        catch (FaultFailureException e) {
+            // expected
+        }
+    }
+
+    public void testMeaningfulPK() throws Exception {
+        deleteAndCreateTwoMeaningfulPKsDataSet();
+
+        SelectQuery query = new SelectQuery(ClientMtMeaningfulPk.class);
+        query.addOrdering(ClientMtMeaningfulPk.PK_PROPERTY, SortOrder.DESCENDING);
+
+        List<?> results = clientContext.performQuery(query);
+        assertEquals(2, results.size());
+    }
+
+    public void testPrefetchingToOne() throws Exception {
+        createTwoMtTable1sAnd2sDataSet();
+
+        final ObjectId prefetchedId = new ObjectId(
+                "MtTable1",
+                MtTable1.TABLE1_ID_PK_COLUMN,
+                1);
+
+        SelectQuery q = new SelectQuery(ClientMtTable2.class);
+        q.addOrdering(ClientMtTable2.GLOBAL_ATTRIBUTE_PROPERTY, SortOrder.ASCENDING);
+        q.addPrefetch(ClientMtTable2.TABLE1_PROPERTY);
+
+        final List<ClientMtTable2> results = clientContext.performQuery(q);
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                assertEquals(2, results.size());
+
+                for (ClientMtTable2 o : results) {
+                    assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
+                    assertSame(clientContext, o.getObjectContext());
+
+                    ClientMtTable1 o1 = o.getTable1();
+                    assertNotNull(o1);
+                    assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
+                    assertSame(clientContext, o1.getObjectContext());
+                    assertEquals(prefetchedId, o1.getObjectId());
+                }
+            }
+        });
+    }
+
+    public void testPrefetchingToOneNull() throws Exception {
+        tMtTable2.insert(15, null, "g3");
+
+        SelectQuery q = new SelectQuery(ClientMtTable2.class);
+        q.addPrefetch(ClientMtTable2.TABLE1_PROPERTY);
+
+        final List<ClientMtTable2> results = clientContext.performQuery(q);
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+
+                assertEquals(1, results.size());
+
+                ClientMtTable2 o = results.get(0);
+                assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
+                assertSame(clientContext, o.getObjectContext());
+
+                assertNull(o.getTable1());
+            }
+        });
+    }
+
+    public void testPrefetchingToMany() throws Exception {
+        createTwoMtTable1sAnd2sDataSet();
+
+        SelectQuery q = new SelectQuery(ClientMtTable1.class);
+        q.addOrdering(ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, SortOrder.ASCENDING);
+        q.addPrefetch(ClientMtTable1.TABLE2ARRAY_PROPERTY);
+
+        final List<ClientMtTable1> results = clientContext.performQuery(q);
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+
+                ClientMtTable1 o1 = results.get(0);
+                assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
+                assertSame(clientContext, o1.getObjectContext());
+
+                List<?> children1 = o1.getTable2Array();
+
+                assertEquals(2, children1.size());
+                Iterator<?> it = children1.iterator();
+                while (it.hasNext()) {
+                    ClientMtTable2 o = (ClientMtTable2) it.next();
+                    assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
+                    assertSame(clientContext, o.getObjectContext());
+
+                    // TODO: fixme... reverse relationship is not connected and will
+                    // cause a fetch
+                    // assertEquals(o1, o.getTable1());
+                }
+            }
+        });
+    }
+
+    public void testPerformPaginatedQuery() throws Exception {
+        createEightMtTable1s();
+
+        SelectQuery query = new SelectQuery(ClientMtTable1.class);
+        query.setPageSize(5);
+        List<ClientMtTable1> objects = clientContext.performQuery(query);
+        assertNotNull(objects);
+        assertTrue(objects instanceof RemoteIncrementalFaultList);
+    }
+
+    public void testPrefetchingToManyEmpty() throws Exception {
+        createTwoMtTable1sAnd2sDataSet();
+
+        SelectQuery q = new SelectQuery(ClientMtTable1.class);
+        q.addOrdering(ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, SortOrder.ASCENDING);
+        q.addPrefetch(ClientMtTable1.TABLE2ARRAY_PROPERTY);
+
+        final List<ClientMtTable1> results = clientContext.performQuery(q);
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                ClientMtTable1 o2 = results.get(1);
+                assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
+                assertSame(clientContext, o2.getObjectContext());
+
+                List<ClientMtTable2> children2 = o2.getTable2Array();
+                assertFalse(((ValueHolder) children2).isFault());
+                assertEquals(0, children2.size());
+            }
+        });
+    }
+
+    public void testOIDQueryInterception() throws Exception {
+
+        final ClientMtTable1 o = clientContext.newObject(ClientMtTable1.class);
+        o.setGlobalAttribute1("aaa");
+
+        // fetch new
+        final ObjectIdQuery q1 = new ObjectIdQuery(
+                o.getObjectId(),
+                false,
+                ObjectIdQuery.CACHE);
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                List<?> objects = clientContext.performQuery(q1);
+                assertEquals(1, objects.size());
+                assertSame(o, objects.get(0));
+            }
+        });
+
+        clientContext.commitChanges();
+
+        // fetch committed
+        final ObjectIdQuery q2 = new ObjectIdQuery(
+                o.getObjectId(),
+                false,
+                ObjectIdQuery.CACHE);
+
+        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+            public void execute() {
+                List<?> objects = clientContext.performQuery(q2);
+                assertEquals(1, objects.size());
+                assertSame(o, objects.get(0));
+            }
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextTest.java
----------------------------------------------------------------------
diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextTest.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextTest.java
deleted file mode 100644
index c9b45a2..0000000
--- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextWithDataContextTest.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne;
-
-import java.sql.Types;
-import java.util.Iterator;
-import java.util.List;
-
-import org.apache.cayenne.access.ClientServerChannel;
-import org.apache.cayenne.access.DataContext;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.LifecycleEvent;
-import org.apache.cayenne.query.ObjectIdQuery;
-import org.apache.cayenne.query.QueryCacheStrategy;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
-import org.apache.cayenne.reflect.LifecycleCallbackRegistry;
-import org.apache.cayenne.remote.RemoteIncrementalFaultList;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.test.parallel.ParallelTestContainer;
-import org.apache.cayenne.testdo.mt.ClientMtMeaningfulPk;
-import org.apache.cayenne.testdo.mt.ClientMtReflexive;
-import org.apache.cayenne.testdo.mt.ClientMtTable1;
-import org.apache.cayenne.testdo.mt.ClientMtTable2;
-import org.apache.cayenne.testdo.mt.MtReflexive;
-import org.apache.cayenne.testdo.mt.MtTable1;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.UnitTestClosure;
-import org.apache.cayenne.unit.di.client.ClientCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT)
-public class CayenneContextWithDataContextTest extends ClientCase {
-
-    @Inject
-    private CayenneContext clientContext;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    @Inject(ClientCase.ROP_CLIENT_KEY)
-    private DataChannelInterceptor clientServerInterceptor;
-
-    @Inject
-    private ClientServerChannel clientServerChannel;
-
-    private TableHelper tMtTable1;
-    private TableHelper tMtTable2;
-
-    private TableHelper tMtMeaningfulPK;
-
-    @Override
-    protected void setUpAfterInjection() throws Exception {
-        dbHelper.deleteAll("MT_TABLE2");
-        dbHelper.deleteAll("MT_TABLE1");
-
-        tMtTable1 = new TableHelper(dbHelper, "MT_TABLE1");
-        tMtTable1.setColumns("TABLE1_ID", "GLOBAL_ATTRIBUTE1", "SERVER_ATTRIBUTE1");
-
-        tMtTable2 = new TableHelper(dbHelper, "MT_TABLE2");
-        tMtTable2.setColumns("TABLE2_ID", "TABLE1_ID", "GLOBAL_ATTRIBUTE").setColumnTypes(
-                Types.INTEGER, Types.INTEGER, Types.VARCHAR);
-
-        tMtMeaningfulPK = new TableHelper(dbHelper, "MT_MEANINGFUL_PK");
-        tMtMeaningfulPK.setColumns("PK");
-    }
-
-    private void deleteAndCreateTwoMeaningfulPKsDataSet() throws Exception {
-        tMtMeaningfulPK.deleteAll();
-        tMtMeaningfulPK.insert("A");
-        tMtMeaningfulPK.insert("B");
-    }
-
-    private void createTwoMtTable1sAnd2sDataSet() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-        tMtTable1.insert(2, "g2", "s2");
-
-        tMtTable2.insert(1, 1, "g1");
-        tMtTable2.insert(2, 1, "g2");
-    }
-
-    private void createEightMtTable1s() throws Exception {
-        for (int i = 1; i <= 8; i++) {
-            tMtTable1.insert(i, "g" + i, "s" + i);
-        }
-    }
-
-    public void testLocalCacheStaysLocal() {
-
-        DataContext serverContext = (DataContext) clientServerChannel.getParentChannel();
-
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
-        query.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        assertEquals(0, clientContext.getQueryCache().size());
-        assertEquals(0, serverContext.getQueryCache().size());
-
-        List<?> results = clientContext.performQuery(query);
-
-        assertEquals(1, clientContext.getQueryCache().size());
-        assertSame(results, clientContext.getQueryCache().get(
-                query.getMetaData(clientContext.getEntityResolver())));
-
-        assertEquals(0, serverContext.getQueryCache().size());
-    }
-
-    public void testAddToList() throws Exception {
-
-        ClientMtTable1 t1 = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable2 t2 = clientContext.newObject(ClientMtTable2.class);
-
-        t1.addToTable2Array(t2);
-        assertEquals(1, t1.getTable2Array().size());
-        assertSame(t1, t2.getTable1());
-
-        // do it again to make sure action can handle series of changes
-        ClientMtTable1 t3 = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable2 t4 = clientContext.newObject(ClientMtTable2.class);
-
-        t3.addToTable2Array(t4);
-        assertEquals(1, t3.getTable2Array().size());
-        assertSame(t3, t4.getTable1());
-    }
-
-    public void testSetValueHolder() throws Exception {
-
-        ClientMtTable1 t1 = clientContext.newObject(ClientMtTable1.class);
-        ClientMtTable2 t2 = clientContext.newObject(ClientMtTable2.class);
-
-        t2.setTable1(t1);
-        assertEquals(1, t1.getTable2Array().size());
-        assertSame(t1, t2.getTable1());
-    }
-
-    public void testPostAddCallback() throws Exception {
-
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        final boolean[] flag = new boolean[1];
-
-        try {
-            callbackRegistry.addListener(MtTable1.class, new LifecycleListener() {
-
-                public void postLoad(Object entity) {
-                }
-
-                public void postPersist(Object entity) {
-                }
-
-                public void postRemove(Object entity) {
-                }
-
-                public void postUpdate(Object entity) {
-                }
-
-                public void postAdd(Object entity) {
-                    flag[0] = true;
-                }
-
-                public void preRemove(Object entity) {
-                }
-
-                public void preUpdate(Object entity) {
-                }
-
-                public void prePersist(Object entity) {
-                }
-            });
-
-            clientContext.newObject(ClientMtTable1.class);
-
-            assertFalse(flag[0]);
-            clientContext.commitChanges();
-            assertTrue(flag[0]);
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    public void testPostAddOnObjectCallback() throws Exception {
-
-        final DataContext serverContext = (DataContext) clientServerChannel.getParentChannel();
-
-        LifecycleCallbackRegistry callbackRegistry = serverContext
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        try {
-            callbackRegistry.addCallback(
-                    LifecycleEvent.POST_ADD,
-                    MtTable1.class,
-                    "prePersistMethod");
-
-            final Persistent clientObject = clientContext.newObject(ClientMtTable1.class);
-            clientContext.commitChanges();
-
-        new ParallelTestContainer() {
-
-            @Override
-            protected void assertResult() throws Exception {
-            	// find peer
-            	MtTable1 peer = (MtTable1) serverContext.getGraphManager().getNode(
-                    clientObject.getObjectId());
-
-            	assertNotNull(peer);
-            	assertTrue(peer.isPrePersisted());
-            }
-        }.runTest(1000);
-
-
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    public void testPreRemoveCallback() throws Exception {
-
-        // an exception was triggered within POST_LOAD callback
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        final boolean[] flag = new boolean[1];
-
-        try {
-            callbackRegistry.addListener(MtTable1.class, new LifecycleListener() {
-
-                public void postLoad(Object entity) {
-                }
-
-                public void postPersist(Object entity) {
-                }
-
-                public void postRemove(Object entity) {
-                }
-
-                public void postUpdate(Object entity) {
-                }
-
-                public void postAdd(Object entity) {
-                }
-
-                public void preRemove(Object entity) {
-                    flag[0] = true;
-                }
-
-                public void preUpdate(Object entity) {
-                }
-
-                public void prePersist(Object entity) {
-                }
-            });
-
-            ClientMtTable1 object = clientContext.newObject(ClientMtTable1.class);
-
-            assertFalse(flag[0]);
-            clientContext.commitChanges();
-            assertFalse(flag[0]);
-
-            clientContext.deleteObjects(object);
-            clientContext.commitChanges();
-            assertTrue(flag[0]);
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    public void testCAY830() throws Exception {
-
-        // an exception was triggered within POST_LOAD callback
-        LifecycleCallbackRegistry callbackRegistry = clientServerChannel
-                .getEntityResolver()
-                .getCallbackRegistry();
-
-        try {
-            callbackRegistry.addListener(MtReflexive.class, new LifecycleListener() {
-
-                public void postLoad(Object entity) {
-                }
-
-                public void postPersist(Object entity) {
-                }
-
-                public void postRemove(Object entity) {
-                }
-
-                public void postUpdate(Object entity) {
-                }
-
-                public void postAdd(Object entity) {
-                }
-
-                public void preRemove(Object entity) {
-                }
-
-                public void preUpdate(Object entity) {
-                }
-
-                public void prePersist(Object entity) {
-                }
-            });
-
-            ClientMtReflexive o1 = clientContext.newObject(ClientMtReflexive.class);
-            o1.setName("parent");
-
-            ClientMtReflexive o2 = clientContext.newObject(ClientMtReflexive.class);
-            o2.setName("child");
-            o2.setToParent(o1);
-            clientContext.commitChanges();
-
-            clientContext.deleteObjects(o1);
-            clientContext.deleteObjects(o2);
-            clientContext.commitChanges();
-            // per CAY-830 an exception is thrown here
-        }
-        finally {
-            callbackRegistry.clear();
-        }
-    }
-
-    public void testRollbackChanges() throws Exception {
-
-        ClientMtTable1 o = clientContext.newObject(ClientMtTable1.class);
-        o.setGlobalAttribute1("1");
-        clientContext.commitChanges();
-
-        assertEquals("1", o.getGlobalAttribute1());
-        o.setGlobalAttribute1("2");
-        assertEquals("2", o.getGlobalAttribute1());
-        clientContext.rollbackChanges();
-
-        assertEquals("1", o.getGlobalAttribute1());
-        assertTrue(clientContext.modifiedObjects().isEmpty());
-    }
-
-    public void testCreateFault() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-
-        ObjectId id = new ObjectId("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 1);
-
-        Object fault = clientContext.createFault(id);
-        assertTrue(fault instanceof ClientMtTable1);
-
-        ClientMtTable1 o = (ClientMtTable1) fault;
-        assertEquals(PersistenceState.HOLLOW, o.getPersistenceState());
-        assertSame(clientContext, o.getObjectContext());
-        assertNull(o.getGlobalAttribute1Direct());
-
-        // make sure we haven't tripped the fault yet
-        assertEquals(PersistenceState.HOLLOW, o.getPersistenceState());
-
-        // try tripping fault
-        assertEquals("g1", o.getGlobalAttribute1());
-        assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-    }
-
-    public void testCreateBadFault() throws Exception {
-        tMtTable1.insert(1, "g1", "s1");
-
-        ObjectId id = new ObjectId("MtTable1", MtTable1.TABLE1_ID_PK_COLUMN, 2);
-
-        Object fault = clientContext.createFault(id);
-        assertTrue(fault instanceof ClientMtTable1);
-
-        ClientMtTable1 o = (ClientMtTable1) fault;
-
-        // try tripping fault
-        try {
-            o.getGlobalAttribute1();
-            fail("resolving bad fault should've thrown");
-        }
-        catch (FaultFailureException e) {
-            // expected
-        }
-    }
-
-    public void testMeaningfulPK() throws Exception {
-        deleteAndCreateTwoMeaningfulPKsDataSet();
-
-        SelectQuery query = new SelectQuery(ClientMtMeaningfulPk.class);
-        query.addOrdering(ClientMtMeaningfulPk.PK_PROPERTY, SortOrder.DESCENDING);
-
-        List<?> results = clientContext.performQuery(query);
-        assertEquals(2, results.size());
-    }
-
-    public void testPrefetchingToOne() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        final ObjectId prefetchedId = new ObjectId(
-                "MtTable1",
-                MtTable1.TABLE1_ID_PK_COLUMN,
-                1);
-
-        SelectQuery q = new SelectQuery(ClientMtTable2.class);
-        q.addOrdering(ClientMtTable2.GLOBAL_ATTRIBUTE_PROPERTY, SortOrder.ASCENDING);
-        q.addPrefetch(ClientMtTable2.TABLE1_PROPERTY);
-
-        final List<ClientMtTable2> results = clientContext.performQuery(q);
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                assertEquals(2, results.size());
-
-                for (ClientMtTable2 o : results) {
-                    assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-                    assertSame(clientContext, o.getObjectContext());
-
-                    ClientMtTable1 o1 = o.getTable1();
-                    assertNotNull(o1);
-                    assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-                    assertSame(clientContext, o1.getObjectContext());
-                    assertEquals(prefetchedId, o1.getObjectId());
-                }
-            }
-        });
-    }
-
-    public void testPrefetchingToOneNull() throws Exception {
-        tMtTable2.insert(15, null, "g3");
-
-        SelectQuery q = new SelectQuery(ClientMtTable2.class);
-        q.addPrefetch(ClientMtTable2.TABLE1_PROPERTY);
-
-        final List<ClientMtTable2> results = clientContext.performQuery(q);
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-
-                assertEquals(1, results.size());
-
-                ClientMtTable2 o = results.get(0);
-                assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-                assertSame(clientContext, o.getObjectContext());
-
-                assertNull(o.getTable1());
-            }
-        });
-    }
-
-    public void testPrefetchingToMany() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        SelectQuery q = new SelectQuery(ClientMtTable1.class);
-        q.addOrdering(ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, SortOrder.ASCENDING);
-        q.addPrefetch(ClientMtTable1.TABLE2ARRAY_PROPERTY);
-
-        final List<ClientMtTable1> results = clientContext.performQuery(q);
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-
-                ClientMtTable1 o1 = results.get(0);
-                assertEquals(PersistenceState.COMMITTED, o1.getPersistenceState());
-                assertSame(clientContext, o1.getObjectContext());
-
-                List<?> children1 = o1.getTable2Array();
-
-                assertEquals(2, children1.size());
-                Iterator<?> it = children1.iterator();
-                while (it.hasNext()) {
-                    ClientMtTable2 o = (ClientMtTable2) it.next();
-                    assertEquals(PersistenceState.COMMITTED, o.getPersistenceState());
-                    assertSame(clientContext, o.getObjectContext());
-
-                    // TODO: fixme... reverse relationship is not connected and will
-                    // cause a fetch
-                    // assertEquals(o1, o.getTable1());
-                }
-            }
-        });
-    }
-
-    public void testPerformPaginatedQuery() throws Exception {
-        createEightMtTable1s();
-
-        SelectQuery query = new SelectQuery(ClientMtTable1.class);
-        query.setPageSize(5);
-        List<ClientMtTable1> objects = clientContext.performQuery(query);
-        assertNotNull(objects);
-        assertTrue(objects instanceof RemoteIncrementalFaultList);
-    }
-
-    public void testPrefetchingToManyEmpty() throws Exception {
-        createTwoMtTable1sAnd2sDataSet();
-
-        SelectQuery q = new SelectQuery(ClientMtTable1.class);
-        q.addOrdering(ClientMtTable1.GLOBAL_ATTRIBUTE1_PROPERTY, SortOrder.ASCENDING);
-        q.addPrefetch(ClientMtTable1.TABLE2ARRAY_PROPERTY);
-
-        final List<ClientMtTable1> results = clientContext.performQuery(q);
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                ClientMtTable1 o2 = results.get(1);
-                assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState());
-                assertSame(clientContext, o2.getObjectContext());
-
-                List<ClientMtTable2> children2 = o2.getTable2Array();
-                assertFalse(((ValueHolder) children2).isFault());
-                assertEquals(0, children2.size());
-            }
-        });
-    }
-
-    public void testOIDQueryInterception() throws Exception {
-
-        final ClientMtTable1 o = clientContext.newObject(ClientMtTable1.class);
-        o.setGlobalAttribute1("aaa");
-
-        // fetch new
-        final ObjectIdQuery q1 = new ObjectIdQuery(
-                o.getObjectId(),
-                false,
-                ObjectIdQuery.CACHE);
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                List<?> objects = clientContext.performQuery(q1);
-                assertEquals(1, objects.size());
-                assertSame(o, objects.get(0));
-            }
-        });
-
-        clientContext.commitChanges();
-
-        // fetch committed
-        final ObjectIdQuery q2 = new ObjectIdQuery(
-                o.getObjectId(),
-                false,
-                ObjectIdQuery.CACHE);
-
-        clientServerInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
-            public void execute() {
-                List<?> objects = clientContext.performQuery(q2);
-                assertEquals(1, objects.size());
-                assertSame(o, objects.get(0));
-            }
-        });
-    }
-}