Rename Integration Tests in cayenne-client (*IT.java instead of *Test.java)
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/fcb1d536 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/fcb1d536 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/fcb1d536 Branch: refs/heads/master Commit: fcb1d5364154294525f1c2087f280cc5d38879f3 Parents: ec5c3cf Author: Savva Kolbechev <[email protected]> Authored: Wed Oct 29 16:53:38 2014 +0300 Committer: Savva Kolbechev <[email protected]> Committed: Thu Oct 30 16:41:59 2014 +0300 ---------------------------------------------------------------------- .../apache/cayenne/CayenneContextCayenneIT.java | 55 ++ .../cayenne/CayenneContextCayenneTest.java | 55 -- .../CayenneContextClientChannelEventsIT.java | 345 ++++++++ .../CayenneContextClientChannelEventsTest.java | 345 -------- .../cayenne/CayenneContextDeleteRulesIT.java | 111 +++ .../cayenne/CayenneContextDeleteRulesTest.java | 111 --- .../apache/cayenne/CayenneContextEJBQLIT.java | 87 ++ .../apache/cayenne/CayenneContextEJBQLTest.java | 87 -- .../CayenneContextGraphDiffCompressorIT.java | 96 +++ .../CayenneContextGraphDiffCompressorTest.java | 96 --- .../org/apache/cayenne/CayenneContextIT.java | 351 ++++++++ .../cayenne/CayenneContextInheritanceIT.java | 151 ++++ .../cayenne/CayenneContextInheritanceTest.java | 151 ---- .../CayenneContextMapRelationshipIT.java | 112 +++ .../CayenneContextMapRelationshipTest.java | 112 --- .../cayenne/CayenneContextMergeHandlerIT.java | 90 ++ .../cayenne/CayenneContextMergeHandlerTest.java | 90 -- .../CayenneContextNamedQueryCachingIT.java | 133 +++ .../CayenneContextNamedQueryCachingTest.java | 133 --- .../CayenneContextPaginatedListCachingIT.java | 75 ++ .../CayenneContextPaginatedListCachingTest.java | 75 -- .../cayenne/CayenneContextPrimitiveIT.java | 100 +++ .../cayenne/CayenneContextPrimitiveTest.java | 100 --- .../cayenne/CayenneContextRefreshQueryIT.java | 76 ++ .../cayenne/CayenneContextRefreshQueryTest.java | 76 -- .../cayenne/CayenneContextRelationshipsIT.java | 100 +++ .../CayenneContextRelationshipsTest.java | 100 --- .../cayenne/CayenneContextSQLTemplateIT.java | 54 ++ .../cayenne/CayenneContextSQLTemplateTest.java | 54 -- .../cayenne/CayenneContextServerDiffsIT.java | 153 ++++ .../cayenne/CayenneContextServerDiffsTest.java | 153 ---- .../org/apache/cayenne/CayenneContextTest.java | 351 -------- .../cayenne/CayenneContextValidationIT.java | 89 ++ .../cayenne/CayenneContextValidationTest.java | 89 -- .../CayenneContextWithDataContextIT.java | 570 ++++++++++++ .../CayenneContextWithDataContextTest.java | 570 ------------ .../apache/cayenne/NestedCayenneContextIT.java | 864 +++++++++++++++++++ .../cayenne/NestedCayenneContextTest.java | 864 ------------------- .../cayenne/PersistentObjectInContextIT.java | 142 +++ .../cayenne/PersistentObjectInContextTest.java | 142 --- .../cayenne/access/ClientServerChannelIT.java | 260 ++++++ .../access/ClientServerChannelQueryIT.java | 239 +++++ .../access/ClientServerChannelQueryTest.java | 239 ----- .../cayenne/access/ClientServerChannelTest.java | 260 ------ .../cayenne/map/ClientEntityResolverIT.java | 62 ++ .../cayenne/map/ClientEntityResolverTest.java | 62 -- .../cayenne/query/ClientExpressionIT.java | 319 +++++++ .../cayenne/query/ClientExpressionTest.java | 319 ------- .../query/ClientSelectQueryExpressionIT.java | 71 ++ .../query/ClientSelectQueryExpressionTest.java | 71 -- .../remote/CayenneContextDeletionIT.java | 38 + .../remote/CayenneContextDeletionTest.java | 38 - .../remote/ClientChannelServerDiffsIT.java | 263 ++++++ .../remote/ClientChannelServerDiffsTest.java | 263 ------ .../cayenne/remote/LightSuperClassIT.java | 95 ++ .../cayenne/remote/LightSuperClassTest.java | 95 -- .../remote/NestedObjectContextLocalIT.java | 58 ++ .../remote/NestedObjectContextLocalTest.java | 58 -- .../NestedObjectContextParentEventsIT.java | 64 ++ .../NestedObjectContextParentEventsTest.java | 64 -- .../remote/NestedObjectContextPeerEventsIT.java | 149 ++++ .../NestedObjectContextPeerEventsTest.java | 149 ---- .../remote/NestedObjectContextRollbackIT.java | 71 ++ .../remote/NestedObjectContextRollbackTest.java | 71 -- .../cayenne/remote/ROPPrefetchToManyMapIT.java | 70 ++ .../remote/ROPPrefetchToManyMapTest.java | 70 -- .../cayenne/remote/RelationshipChangeIT.java | 60 ++ .../cayenne/remote/RelationshipChangeTest.java | 60 -- .../cayenne/remote/RemoteCallbacksIT.java | 118 +++ .../cayenne/remote/RemoteCallbacksTest.java | 118 --- .../remote/RemoteIncrementalFaultListIT.java | 266 ++++++ .../remote/RemoteIncrementalFaultListTest.java | 266 ------ .../apache/cayenne/remote/RemoteRollbackIT.java | 147 ++++ .../cayenne/remote/RemoteRollbackTest.java | 147 ---- .../apache/cayenne/remote/ValueInjectorIT.java | 73 ++ .../cayenne/remote/ValueInjectorTest.java | 73 -- .../unit/di/client/ClientCaseSelfIT.java | 46 + .../unit/di/client/ClientCaseSelfTest.java | 46 - .../cayenne/util/ObjectDetachOperationIT.java | 112 +++ .../cayenne/util/ObjectDetachOperationTest.java | 112 --- .../util/ShallowMergeOperation_ClientIT.java | 210 +++++ .../util/ShallowMergeOperation_ClientTest.java | 210 ----- 82 files changed, 6545 insertions(+), 6545 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneIT.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneIT.java new file mode 100644 index 0000000..31c9d97 --- /dev/null +++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneIT.java @@ -0,0 +1,55 @@ +/***************************************************************** + * 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.query.SQLTemplate; +import org.apache.cayenne.test.jdbc.DBHelper; +import org.apache.cayenne.testdo.mt.ClientMtTable1; +import org.apache.cayenne.unit.di.client.ClientCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) +public class CayenneContextCayenneIT 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 testObjectForPK() throws Exception { + + context.performGenericQuery(new SQLTemplate( + ClientMtTable1.class, + "insert into MT_TABLE1 " + + "(TABLE1_ID, GLOBAL_ATTRIBUTE1, SERVER_ATTRIBUTE1) " + + "values (1, 'g1', 's1')")); + + ClientMtTable1 o = Cayenne.objectForPK(context, ClientMtTable1.class, 1); + assertNotNull(o); + assertEquals("g1", o.getGlobalAttribute1()); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneTest.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneTest.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneTest.java deleted file mode 100644 index b3d8c89..0000000 --- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextCayenneTest.java +++ /dev/null @@ -1,55 +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.query.SQLTemplate; -import org.apache.cayenne.test.jdbc.DBHelper; -import org.apache.cayenne.testdo.mt.ClientMtTable1; -import org.apache.cayenne.unit.di.client.ClientCase; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) -public class CayenneContextCayenneTest 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 testObjectForPK() throws Exception { - - context.performGenericQuery(new SQLTemplate( - ClientMtTable1.class, - "insert into MT_TABLE1 " - + "(TABLE1_ID, GLOBAL_ATTRIBUTE1, SERVER_ATTRIBUTE1) " - + "values (1, 'g1', 's1')")); - - ClientMtTable1 o = Cayenne.objectForPK(context, ClientMtTable1.class, 1); - assertNotNull(o); - assertEquals("g1", o.getGlobalAttribute1()); - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java new file mode 100644 index 0000000..c4af230 --- /dev/null +++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsIT.java @@ -0,0 +1,345 @@ +/***************************************************************** + * 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.configuration.Constants; +import org.apache.cayenne.configuration.rop.client.ClientRuntime; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.query.ObjectIdQuery; +import org.apache.cayenne.test.jdbc.DBHelper; +import org.apache.cayenne.test.jdbc.TableHelper; +import org.apache.cayenne.testdo.mt.ClientMtTable1; +import org.apache.cayenne.testdo.mt.ClientMtTable2; +import org.apache.cayenne.testdo.mt.ClientMtTable4; +import org.apache.cayenne.testdo.mt.ClientMtTable5; +import org.apache.cayenne.unit.di.client.ClientCase; +import org.apache.cayenne.unit.di.client.ClientRuntimeProperty; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +/** + * Tests peer context synchronization via ClientChannel events. + */ +@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) +@ClientRuntimeProperty({ + Constants.ROP_CHANNEL_EVENTS_PROPERTY, "true" +}) +public class CayenneContextClientChannelEventsIT extends ClientCase { + + @Inject + private DBHelper dbHelper; + + @Inject + private ClientRuntime runtime; + + private TableHelper tMtTable1; + private TableHelper tMtTable2; + private TableHelper tMtTable4; + private TableHelper tMtTable5; + private TableHelper tMtJoin45; + + @Override + protected void setUpAfterInjection() throws Exception { + dbHelper.deleteAll("MT_TABLE2"); + dbHelper.deleteAll("MT_TABLE1"); + dbHelper.deleteAll("MT_JOIN45"); + dbHelper.deleteAll("MT_TABLE4"); + dbHelper.deleteAll("MT_TABLE5"); + + 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"); + + tMtTable4 = new TableHelper(dbHelper, "MT_TABLE4"); + tMtTable4.setColumns("ID"); + + tMtTable5 = new TableHelper(dbHelper, "MT_TABLE5"); + tMtTable5.setColumns("ID"); + + tMtJoin45 = new TableHelper(dbHelper, "MT_JOIN45"); + tMtJoin45.setColumns("TABLE4_ID", "TABLE5_ID"); + } + + public void testSyncNewObject() throws Exception { + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + assertNotSame(c1, c2); + + ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class); + o1.setGlobalAttribute1("X"); + c1.commitChanges(); + + ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode( + o1.getObjectId()); + + assertNull(o2); + // now fetch it fresh + + o2 = (ClientMtTable1) c2.performQuery(new ObjectIdQuery(o1.getObjectId())).get(0); + assertNotNull(o2); + + assertEquals("X", o2.getGlobalAttribute1()); + assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState()); + assertFalse(c1.internalGraphManager().hasChanges()); + assertFalse(c2.internalGraphManager().hasChanges()); + } + + public void testSyncNewDeletedObject() throws Exception { + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + assertNotSame(c1, c2); + + // insert, then delete - this shouldn't propagate via an event. + ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class); + o1.setGlobalAttribute1("X"); + c1.deleteObjects(o1); + + // introduce some other change so that commit can go ahead... + ClientMtTable1 o1x = c1.newObject(ClientMtTable1.class); + o1x.setGlobalAttribute1("Y"); + c1.commitChanges(); + + ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode( + o1.getObjectId()); + + assertNull(o2); + + assertFalse(c1.internalGraphManager().hasChanges()); + assertFalse(c2.internalGraphManager().hasChanges()); + } + + public void testSyncNewObjectIntoDirtyContext() throws Exception { + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + assertNotSame(c1, c2); + + // make sure c2 has uncommitted changes + c2.newObject(ClientMtTable1.class); + + ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class); + o1.setGlobalAttribute1("X"); + c1.commitChanges(); + + ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode( + o1.getObjectId()); + assertNull(o2); + + // now fetch it fresh + + o2 = (ClientMtTable1) c2.performQuery(new ObjectIdQuery(o1.getObjectId())).get(0); + assertNotNull(o2); + assertEquals("X", o2.getGlobalAttribute1()); + assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState()); + assertFalse(c1.internalGraphManager().hasChanges()); + assertTrue(c2.internalGraphManager().hasChanges()); + } + + public void testSyncSimpleProperty() throws Exception { + + tMtTable1.insert(1, "g1", "s1"); + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + assertNotSame(c1, c2); + + ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery( + c1, + new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); + + ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery( + c2, + new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); + + assertEquals("g1", o1.getGlobalAttribute1()); + assertEquals("g1", o2.getGlobalAttribute1()); + + o1.setGlobalAttribute1("X"); + c1.commitChanges(); + + // let the events propagate to peers + Thread.sleep(500); + + assertEquals("X", o2.getGlobalAttribute1()); + assertFalse(c1.internalGraphManager().hasChanges()); + assertFalse(c2.internalGraphManager().hasChanges()); + } + + public void testSyncToOneRelationship() throws Exception { + + tMtTable1.insert(1, "g1", "s1"); + tMtTable1.insert(2, "g2", "s2"); + tMtTable2.insert(1, 1, "g1"); + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + + ClientMtTable2 o1 = (ClientMtTable2) Cayenne.objectForQuery( + c1, + new ObjectIdQuery(new ObjectId("MtTable2", "TABLE2_ID", 1))); + + ClientMtTable2 o2 = (ClientMtTable2) Cayenne.objectForQuery( + c2, + new ObjectIdQuery(new ObjectId("MtTable2", "TABLE2_ID", 1))); + + assertEquals("g1", o1.getTable1().getGlobalAttribute1()); + assertEquals("g1", o2.getTable1().getGlobalAttribute1()); + + ClientMtTable1 o1r = (ClientMtTable1) Cayenne.objectForQuery( + c1, + new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 2))); + o1.setTable1(o1r); + c1.commitChanges(); + + // let the events propagate to peers + Thread.sleep(500); + + assertEquals("g2", o2.getTable1().getGlobalAttribute1()); + assertEquals(o1r.getObjectId(), o2.getTable1().getObjectId()); + assertFalse(c1.internalGraphManager().hasChanges()); + assertFalse(c2.internalGraphManager().hasChanges()); + } + + public void testSyncToManyRelationship() throws Exception { + tMtTable1.insert(1, "g1", "s1"); + tMtTable2.insert(1, 1, "g1"); + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + + ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery( + c1, + new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); + + ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery( + c2, + new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); + + assertEquals(1, o1.getTable2Array().size()); + assertEquals(1, o2.getTable2Array().size()); + + ClientMtTable2 o1r = c1.newObject(ClientMtTable2.class); + o1r.setGlobalAttribute("X"); + o1.addToTable2Array(o1r); + + c1.commitChanges(); + + // let the events propagate to peers + Thread.sleep(500); + + assertEquals(2, o1.getTable2Array().size()); + assertEquals(2, o2.getTable2Array().size()); + assertFalse(c1.internalGraphManager().hasChanges()); + assertFalse(c2.internalGraphManager().hasChanges()); + } + + public void testSyncToManyRelationship1() throws Exception { + tMtTable1.insert(1, "g1", "s1"); + tMtTable2.insert(1, 1, "g1"); + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + + ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery( + c1, + new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); + + // do not resolve objects in question in the second context and see if the merge + // causes any issues... + + assertEquals(1, o1.getTable2Array().size()); + + ClientMtTable2 o1r = c1.newObject(ClientMtTable2.class); + o1r.setGlobalAttribute("X"); + o1.addToTable2Array(o1r); + + c1.commitChanges(); + + assertEquals(2, o1.getTable2Array().size()); + + assertFalse(c1.internalGraphManager().hasChanges()); + assertFalse(c2.internalGraphManager().hasChanges()); + + ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery( + c2, + new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); + assertEquals(2, o2.getTable2Array().size()); + } + + public void testSyncManyToManyRelationship() throws Exception { + tMtTable4.insert(1); + tMtTable5.insert(1); + tMtTable5.insert(2); + tMtJoin45.insert(1, 1); + tMtJoin45.insert(1, 2); + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + + ClientMtTable4 o1 = (ClientMtTable4) Cayenne.objectForQuery( + c1, + new ObjectIdQuery(new ObjectId("MtTable4", "ID", 1))); + + ClientMtTable4 o2 = (ClientMtTable4) Cayenne.objectForQuery( + c2, + new ObjectIdQuery(new ObjectId("MtTable4", "ID", 1))); + + assertEquals(2, o1.getTable5s().size()); + assertEquals(2, o2.getTable5s().size()); + + ClientMtTable5 o1r = (ClientMtTable5) Cayenne.objectForQuery( + c1, + new ObjectIdQuery(new ObjectId("MtTable5", "ID", 1))); + o1.removeFromTable5s(o1r); + + c1.commitChanges(); + // let the events propagate to peers + Thread.sleep(500); + + assertEquals(1, o1.getTable5s().size()); + assertEquals(1, o2.getTable5s().size()); + assertFalse(c1.internalGraphManager().hasChanges()); + assertFalse(c2.internalGraphManager().hasChanges()); + } + + public void testSyncManyToManyRelationship1() throws Exception { + + CayenneContext c1 = (CayenneContext) runtime.newContext(); + CayenneContext c2 = (CayenneContext) runtime.newContext(); + + ClientMtTable4 o1 = c1.newObject(ClientMtTable4.class); + ClientMtTable5 o1r = c1.newObject(ClientMtTable5.class); + c1.commitChanges(); + + ClientMtTable4 o2 = c2.localObject(o1); + ClientMtTable5 o2r = c2.localObject(o1r); + + o2.addToTable5s(o2r); + c2.commitChanges(); + + assertEquals(1, o1.getTable5s().size()); + assertEquals(1, o2.getTable5s().size()); + assertFalse(c1.internalGraphManager().hasChanges()); + assertFalse(c2.internalGraphManager().hasChanges()); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTest.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTest.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTest.java deleted file mode 100644 index 6b4238e..0000000 --- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextClientChannelEventsTest.java +++ /dev/null @@ -1,345 +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.configuration.Constants; -import org.apache.cayenne.configuration.rop.client.ClientRuntime; -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.query.ObjectIdQuery; -import org.apache.cayenne.test.jdbc.DBHelper; -import org.apache.cayenne.test.jdbc.TableHelper; -import org.apache.cayenne.testdo.mt.ClientMtTable1; -import org.apache.cayenne.testdo.mt.ClientMtTable2; -import org.apache.cayenne.testdo.mt.ClientMtTable4; -import org.apache.cayenne.testdo.mt.ClientMtTable5; -import org.apache.cayenne.unit.di.client.ClientCase; -import org.apache.cayenne.unit.di.client.ClientRuntimeProperty; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -/** - * Tests peer context synchronization via ClientChannel events. - */ -@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) -@ClientRuntimeProperty({ - Constants.ROP_CHANNEL_EVENTS_PROPERTY, "true" -}) -public class CayenneContextClientChannelEventsTest extends ClientCase { - - @Inject - private DBHelper dbHelper; - - @Inject - private ClientRuntime runtime; - - private TableHelper tMtTable1; - private TableHelper tMtTable2; - private TableHelper tMtTable4; - private TableHelper tMtTable5; - private TableHelper tMtJoin45; - - @Override - protected void setUpAfterInjection() throws Exception { - dbHelper.deleteAll("MT_TABLE2"); - dbHelper.deleteAll("MT_TABLE1"); - dbHelper.deleteAll("MT_JOIN45"); - dbHelper.deleteAll("MT_TABLE4"); - dbHelper.deleteAll("MT_TABLE5"); - - 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"); - - tMtTable4 = new TableHelper(dbHelper, "MT_TABLE4"); - tMtTable4.setColumns("ID"); - - tMtTable5 = new TableHelper(dbHelper, "MT_TABLE5"); - tMtTable5.setColumns("ID"); - - tMtJoin45 = new TableHelper(dbHelper, "MT_JOIN45"); - tMtJoin45.setColumns("TABLE4_ID", "TABLE5_ID"); - } - - public void testSyncNewObject() throws Exception { - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - assertNotSame(c1, c2); - - ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class); - o1.setGlobalAttribute1("X"); - c1.commitChanges(); - - ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode( - o1.getObjectId()); - - assertNull(o2); - // now fetch it fresh - - o2 = (ClientMtTable1) c2.performQuery(new ObjectIdQuery(o1.getObjectId())).get(0); - assertNotNull(o2); - - assertEquals("X", o2.getGlobalAttribute1()); - assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState()); - assertFalse(c1.internalGraphManager().hasChanges()); - assertFalse(c2.internalGraphManager().hasChanges()); - } - - public void testSyncNewDeletedObject() throws Exception { - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - assertNotSame(c1, c2); - - // insert, then delete - this shouldn't propagate via an event. - ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class); - o1.setGlobalAttribute1("X"); - c1.deleteObjects(o1); - - // introduce some other change so that commit can go ahead... - ClientMtTable1 o1x = c1.newObject(ClientMtTable1.class); - o1x.setGlobalAttribute1("Y"); - c1.commitChanges(); - - ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode( - o1.getObjectId()); - - assertNull(o2); - - assertFalse(c1.internalGraphManager().hasChanges()); - assertFalse(c2.internalGraphManager().hasChanges()); - } - - public void testSyncNewObjectIntoDirtyContext() throws Exception { - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - assertNotSame(c1, c2); - - // make sure c2 has uncommitted changes - c2.newObject(ClientMtTable1.class); - - ClientMtTable1 o1 = c1.newObject(ClientMtTable1.class); - o1.setGlobalAttribute1("X"); - c1.commitChanges(); - - ClientMtTable1 o2 = (ClientMtTable1) c2.getGraphManager().getNode( - o1.getObjectId()); - assertNull(o2); - - // now fetch it fresh - - o2 = (ClientMtTable1) c2.performQuery(new ObjectIdQuery(o1.getObjectId())).get(0); - assertNotNull(o2); - assertEquals("X", o2.getGlobalAttribute1()); - assertEquals(PersistenceState.COMMITTED, o2.getPersistenceState()); - assertFalse(c1.internalGraphManager().hasChanges()); - assertTrue(c2.internalGraphManager().hasChanges()); - } - - public void testSyncSimpleProperty() throws Exception { - - tMtTable1.insert(1, "g1", "s1"); - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - assertNotSame(c1, c2); - - ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery( - c1, - new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); - - ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery( - c2, - new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); - - assertEquals("g1", o1.getGlobalAttribute1()); - assertEquals("g1", o2.getGlobalAttribute1()); - - o1.setGlobalAttribute1("X"); - c1.commitChanges(); - - // let the events propagate to peers - Thread.sleep(500); - - assertEquals("X", o2.getGlobalAttribute1()); - assertFalse(c1.internalGraphManager().hasChanges()); - assertFalse(c2.internalGraphManager().hasChanges()); - } - - public void testSyncToOneRelationship() throws Exception { - - tMtTable1.insert(1, "g1", "s1"); - tMtTable1.insert(2, "g2", "s2"); - tMtTable2.insert(1, 1, "g1"); - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - - ClientMtTable2 o1 = (ClientMtTable2) Cayenne.objectForQuery( - c1, - new ObjectIdQuery(new ObjectId("MtTable2", "TABLE2_ID", 1))); - - ClientMtTable2 o2 = (ClientMtTable2) Cayenne.objectForQuery( - c2, - new ObjectIdQuery(new ObjectId("MtTable2", "TABLE2_ID", 1))); - - assertEquals("g1", o1.getTable1().getGlobalAttribute1()); - assertEquals("g1", o2.getTable1().getGlobalAttribute1()); - - ClientMtTable1 o1r = (ClientMtTable1) Cayenne.objectForQuery( - c1, - new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 2))); - o1.setTable1(o1r); - c1.commitChanges(); - - // let the events propagate to peers - Thread.sleep(500); - - assertEquals("g2", o2.getTable1().getGlobalAttribute1()); - assertEquals(o1r.getObjectId(), o2.getTable1().getObjectId()); - assertFalse(c1.internalGraphManager().hasChanges()); - assertFalse(c2.internalGraphManager().hasChanges()); - } - - public void testSyncToManyRelationship() throws Exception { - tMtTable1.insert(1, "g1", "s1"); - tMtTable2.insert(1, 1, "g1"); - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - - ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery( - c1, - new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); - - ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery( - c2, - new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); - - assertEquals(1, o1.getTable2Array().size()); - assertEquals(1, o2.getTable2Array().size()); - - ClientMtTable2 o1r = c1.newObject(ClientMtTable2.class); - o1r.setGlobalAttribute("X"); - o1.addToTable2Array(o1r); - - c1.commitChanges(); - - // let the events propagate to peers - Thread.sleep(500); - - assertEquals(2, o1.getTable2Array().size()); - assertEquals(2, o2.getTable2Array().size()); - assertFalse(c1.internalGraphManager().hasChanges()); - assertFalse(c2.internalGraphManager().hasChanges()); - } - - public void testSyncToManyRelationship1() throws Exception { - tMtTable1.insert(1, "g1", "s1"); - tMtTable2.insert(1, 1, "g1"); - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - - ClientMtTable1 o1 = (ClientMtTable1) Cayenne.objectForQuery( - c1, - new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); - - // do not resolve objects in question in the second context and see if the merge - // causes any issues... - - assertEquals(1, o1.getTable2Array().size()); - - ClientMtTable2 o1r = c1.newObject(ClientMtTable2.class); - o1r.setGlobalAttribute("X"); - o1.addToTable2Array(o1r); - - c1.commitChanges(); - - assertEquals(2, o1.getTable2Array().size()); - - assertFalse(c1.internalGraphManager().hasChanges()); - assertFalse(c2.internalGraphManager().hasChanges()); - - ClientMtTable1 o2 = (ClientMtTable1) Cayenne.objectForQuery( - c2, - new ObjectIdQuery(new ObjectId("MtTable1", "TABLE1_ID", 1))); - assertEquals(2, o2.getTable2Array().size()); - } - - public void testSyncManyToManyRelationship() throws Exception { - tMtTable4.insert(1); - tMtTable5.insert(1); - tMtTable5.insert(2); - tMtJoin45.insert(1, 1); - tMtJoin45.insert(1, 2); - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - - ClientMtTable4 o1 = (ClientMtTable4) Cayenne.objectForQuery( - c1, - new ObjectIdQuery(new ObjectId("MtTable4", "ID", 1))); - - ClientMtTable4 o2 = (ClientMtTable4) Cayenne.objectForQuery( - c2, - new ObjectIdQuery(new ObjectId("MtTable4", "ID", 1))); - - assertEquals(2, o1.getTable5s().size()); - assertEquals(2, o2.getTable5s().size()); - - ClientMtTable5 o1r = (ClientMtTable5) Cayenne.objectForQuery( - c1, - new ObjectIdQuery(new ObjectId("MtTable5", "ID", 1))); - o1.removeFromTable5s(o1r); - - c1.commitChanges(); - // let the events propagate to peers - Thread.sleep(500); - - assertEquals(1, o1.getTable5s().size()); - assertEquals(1, o2.getTable5s().size()); - assertFalse(c1.internalGraphManager().hasChanges()); - assertFalse(c2.internalGraphManager().hasChanges()); - } - - public void testSyncManyToManyRelationship1() throws Exception { - - CayenneContext c1 = (CayenneContext) runtime.newContext(); - CayenneContext c2 = (CayenneContext) runtime.newContext(); - - ClientMtTable4 o1 = c1.newObject(ClientMtTable4.class); - ClientMtTable5 o1r = c1.newObject(ClientMtTable5.class); - c1.commitChanges(); - - ClientMtTable4 o2 = c2.localObject(o1); - ClientMtTable5 o2r = c2.localObject(o1r); - - o2.addToTable5s(o2r); - c2.commitChanges(); - - assertEquals(1, o1.getTable5s().size()); - assertEquals(1, o2.getTable5s().size()); - assertFalse(c1.internalGraphManager().hasChanges()); - assertFalse(c2.internalGraphManager().hasChanges()); - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesIT.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesIT.java new file mode 100644 index 0000000..f9af40f --- /dev/null +++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesIT.java @@ -0,0 +1,111 @@ +/***************************************************************** + * 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.testdo.mt.ClientMtDeleteCascade; +import org.apache.cayenne.testdo.mt.ClientMtDeleteDeny; +import org.apache.cayenne.testdo.mt.ClientMtDeleteNullify; +import org.apache.cayenne.testdo.mt.ClientMtDeleteRule; +import org.apache.cayenne.unit.di.client.ClientCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) +public class CayenneContextDeleteRulesIT extends ClientCase { + + @Inject + private CayenneContext context; + + public void testNullifyToOne() { + + ClientMtDeleteNullify object = context.newObject(ClientMtDeleteNullify.class); + object.setName("object"); + + ClientMtDeleteRule related = context.newObject(ClientMtDeleteRule.class); + object.setName("related"); + + object.setNullify(related); + context.commitChanges(); + + context.deleteObjects(object); + assertFalse(related.getFromNullify().contains(object)); + assertNull(object.getNullify()); + + // And be sure that the commit works afterwards, just for sanity + context.commitChanges(); + } + + public void testDenyToOne() { + + ClientMtDeleteDeny object = context.newObject(ClientMtDeleteDeny.class); + ClientMtDeleteRule related = context.newObject(ClientMtDeleteRule.class); + object.setDeny(related); + context.commitChanges(); + + try { + context.deleteObjects(object); + fail("Should have thrown an exception"); + } + catch (DeleteDenyException e) { + // expected + } + + object.setDeny(null); + context.deleteObjects(object); + context.commitChanges(); + } + + public void testCascadeToOne() { + + ClientMtDeleteCascade object = context.newObject(ClientMtDeleteCascade.class); + object.setName("object"); + + ClientMtDeleteRule related = context.newObject(ClientMtDeleteRule.class); + object.setName("related"); + + object.setCascade(related); + context.commitChanges(); + + context.deleteObjects(object); + assertEquals(PersistenceState.DELETED, related.getPersistenceState()); + assertTrue(context.deletedObjects().contains(related)); + + // And be sure that the commit works afterwards, just for sanity + context.commitChanges(); + } + + public void testCascadeToOneNewObject() { + + ClientMtDeleteRule related = context.newObject(ClientMtDeleteRule.class); + context.commitChanges(); + + ClientMtDeleteCascade object = context.newObject(ClientMtDeleteCascade.class); + object.setName("object"); + object.setCascade(related); + + context.deleteObjects(object); + assertEquals(PersistenceState.TRANSIENT, object.getPersistenceState()); + assertEquals(PersistenceState.DELETED, related.getPersistenceState()); + assertFalse(context.deletedObjects().contains(object)); + assertTrue(context.deletedObjects().contains(related)); + + context.commitChanges(); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesTest.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesTest.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesTest.java deleted file mode 100644 index 6d9cf99..0000000 --- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextDeleteRulesTest.java +++ /dev/null @@ -1,111 +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.testdo.mt.ClientMtDeleteCascade; -import org.apache.cayenne.testdo.mt.ClientMtDeleteDeny; -import org.apache.cayenne.testdo.mt.ClientMtDeleteNullify; -import org.apache.cayenne.testdo.mt.ClientMtDeleteRule; -import org.apache.cayenne.unit.di.client.ClientCase; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) -public class CayenneContextDeleteRulesTest extends ClientCase { - - @Inject - private CayenneContext context; - - public void testNullifyToOne() { - - ClientMtDeleteNullify object = context.newObject(ClientMtDeleteNullify.class); - object.setName("object"); - - ClientMtDeleteRule related = context.newObject(ClientMtDeleteRule.class); - object.setName("related"); - - object.setNullify(related); - context.commitChanges(); - - context.deleteObjects(object); - assertFalse(related.getFromNullify().contains(object)); - assertNull(object.getNullify()); - - // And be sure that the commit works afterwards, just for sanity - context.commitChanges(); - } - - public void testDenyToOne() { - - ClientMtDeleteDeny object = context.newObject(ClientMtDeleteDeny.class); - ClientMtDeleteRule related = context.newObject(ClientMtDeleteRule.class); - object.setDeny(related); - context.commitChanges(); - - try { - context.deleteObjects(object); - fail("Should have thrown an exception"); - } - catch (DeleteDenyException e) { - // expected - } - - object.setDeny(null); - context.deleteObjects(object); - context.commitChanges(); - } - - public void testCascadeToOne() { - - ClientMtDeleteCascade object = context.newObject(ClientMtDeleteCascade.class); - object.setName("object"); - - ClientMtDeleteRule related = context.newObject(ClientMtDeleteRule.class); - object.setName("related"); - - object.setCascade(related); - context.commitChanges(); - - context.deleteObjects(object); - assertEquals(PersistenceState.DELETED, related.getPersistenceState()); - assertTrue(context.deletedObjects().contains(related)); - - // And be sure that the commit works afterwards, just for sanity - context.commitChanges(); - } - - public void testCascadeToOneNewObject() { - - ClientMtDeleteRule related = context.newObject(ClientMtDeleteRule.class); - context.commitChanges(); - - ClientMtDeleteCascade object = context.newObject(ClientMtDeleteCascade.class); - object.setName("object"); - object.setCascade(related); - - context.deleteObjects(object); - assertEquals(PersistenceState.TRANSIENT, object.getPersistenceState()); - assertEquals(PersistenceState.DELETED, related.getPersistenceState()); - assertFalse(context.deletedObjects().contains(object)); - assertTrue(context.deletedObjects().contains(related)); - - context.commitChanges(); - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLIT.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLIT.java new file mode 100644 index 0000000..f9805fa --- /dev/null +++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLIT.java @@ -0,0 +1,87 @@ +/***************************************************************** + * 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.query.EJBQLQuery; +import org.apache.cayenne.test.jdbc.DBHelper; +import org.apache.cayenne.test.jdbc.TableHelper; +import org.apache.cayenne.testdo.mt.ClientMtTable1; +import org.apache.cayenne.unit.di.client.ClientCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +import java.util.List; + +@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) +public class CayenneContextEJBQLIT extends ClientCase { + + @Inject + private DBHelper dbHelper; + + @Inject + private CayenneContext context; + + private TableHelper tMtTable1; + + @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"); + } + + private void createTwoRecords() throws Exception { + tMtTable1.insert(1, "g1", "s1"); + tMtTable1.insert(2, "g2", "s2"); + } + + public void testEJBQLSelect() throws Exception { + createTwoRecords(); + + EJBQLQuery query = new EJBQLQuery("SELECT a FROM MtTable1 a"); + List<ClientMtTable1> results = context.performQuery(query); + + assertEquals(2, results.size()); + } + + public void testEJBQLSelectScalar() throws Exception { + createTwoRecords(); + + EJBQLQuery query = new EJBQLQuery("SELECT COUNT(a) FROM MtTable1 a"); + + List<Long> results = context.performQuery(query); + assertEquals(Long.valueOf(2), results.get(0)); + } + + public void testEJBQLSelectMixed() throws Exception { + createTwoRecords(); + + EJBQLQuery query = new EJBQLQuery( + "SELECT COUNT(a), a, a.serverAttribute1 FROM MtTable1 a Group By a ORDER BY a.serverAttribute1"); + + List<Object[]> results = context.performQuery(query); + + assertEquals(2, results.size()); + assertEquals(Long.valueOf(1), results.get(0)[0]); + assertTrue(results.get(0)[1] instanceof ClientMtTable1); + assertEquals("s1", results.get(0)[2]); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLTest.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLTest.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLTest.java deleted file mode 100644 index f9226b8..0000000 --- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextEJBQLTest.java +++ /dev/null @@ -1,87 +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.util.List; - -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.query.EJBQLQuery; -import org.apache.cayenne.test.jdbc.DBHelper; -import org.apache.cayenne.test.jdbc.TableHelper; -import org.apache.cayenne.testdo.mt.ClientMtTable1; -import org.apache.cayenne.unit.di.client.ClientCase; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) -public class CayenneContextEJBQLTest extends ClientCase { - - @Inject - private DBHelper dbHelper; - - @Inject - private CayenneContext context; - - private TableHelper tMtTable1; - - @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"); - } - - private void createTwoRecords() throws Exception { - tMtTable1.insert(1, "g1", "s1"); - tMtTable1.insert(2, "g2", "s2"); - } - - public void testEJBQLSelect() throws Exception { - createTwoRecords(); - - EJBQLQuery query = new EJBQLQuery("SELECT a FROM MtTable1 a"); - List<ClientMtTable1> results = context.performQuery(query); - - assertEquals(2, results.size()); - } - - public void testEJBQLSelectScalar() throws Exception { - createTwoRecords(); - - EJBQLQuery query = new EJBQLQuery("SELECT COUNT(a) FROM MtTable1 a"); - - List<Long> results = context.performQuery(query); - assertEquals(Long.valueOf(2), results.get(0)); - } - - public void testEJBQLSelectMixed() throws Exception { - createTwoRecords(); - - EJBQLQuery query = new EJBQLQuery( - "SELECT COUNT(a), a, a.serverAttribute1 FROM MtTable1 a Group By a ORDER BY a.serverAttribute1"); - - List<Object[]> results = context.performQuery(query); - - assertEquals(2, results.size()); - assertEquals(Long.valueOf(1), results.get(0)[0]); - assertTrue(results.get(0)[1] instanceof ClientMtTable1); - assertEquals("s1", results.get(0)[2]); - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorIT.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorIT.java new file mode 100644 index 0000000..1469c8b --- /dev/null +++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorIT.java @@ -0,0 +1,96 @@ +/***************************************************************** + * 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.testdo.mt.ClientMtTable1; +import org.apache.cayenne.testdo.mt.ClientMtTable2; +import org.apache.cayenne.unit.di.DataChannelInterceptor; +import org.apache.cayenne.unit.di.DataChannelSyncStats; +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 CayenneContextGraphDiffCompressorIT extends ClientCase { + + @Inject(ClientCase.ROP_CLIENT_KEY) + protected DataChannelInterceptor clientServerInterceptor; + + @Inject + protected CayenneContext context; + + public void testMultipleSimpleProperties() { + + ClientMtTable1 o1 = context.newObject(ClientMtTable1.class); + o1.setGlobalAttribute1("v1"); + o1.setGlobalAttribute1("v2"); + + DataChannelSyncStats stats = clientServerInterceptor + .runWithSyncStatsCollection(new UnitTestClosure() { + + public void execute() { + context.commitChanges(); + } + }); + + assertEquals(1, stats.nodePropertiesChanged); + assertEquals(1, stats.nodesCreated); + } + + public void testComplimentaryArcs() { + + ClientMtTable1 o1 = context.newObject(ClientMtTable1.class); + ClientMtTable2 o2 = context.newObject(ClientMtTable2.class); + o2.setTable1(o1); + o2.setTable1(null); + + DataChannelSyncStats stats = clientServerInterceptor + .runWithSyncStatsCollection(new UnitTestClosure() { + + public void execute() { + context.commitChanges(); + } + }); + + assertEquals(0, stats.nodePropertiesChanged); + assertEquals(2, stats.nodesCreated); + assertEquals(0, stats.arcsCreated); + assertEquals(0, stats.arcsDeleted); + } + + public void testDelete() { + + ClientMtTable1 o1 = context.newObject(ClientMtTable1.class); + o1.setGlobalAttribute1("v1"); + context.deleteObjects(o1); + + DataChannelSyncStats stats = clientServerInterceptor + .runWithSyncStatsCollection(new UnitTestClosure() { + + public void execute() { + context.commitChanges(); + } + }); + assertEquals(0, stats.nodePropertiesChanged); + assertEquals(0, stats.nodesCreated); + assertEquals(0, stats.nodesRemoved); + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java deleted file mode 100644 index b213e55..0000000 --- a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextGraphDiffCompressorTest.java +++ /dev/null @@ -1,96 +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.testdo.mt.ClientMtTable1; -import org.apache.cayenne.testdo.mt.ClientMtTable2; -import org.apache.cayenne.unit.di.DataChannelInterceptor; -import org.apache.cayenne.unit.di.DataChannelSyncStats; -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 CayenneContextGraphDiffCompressorTest extends ClientCase { - - @Inject(ClientCase.ROP_CLIENT_KEY) - protected DataChannelInterceptor clientServerInterceptor; - - @Inject - protected CayenneContext context; - - public void testMultipleSimpleProperties() { - - ClientMtTable1 o1 = context.newObject(ClientMtTable1.class); - o1.setGlobalAttribute1("v1"); - o1.setGlobalAttribute1("v2"); - - DataChannelSyncStats stats = clientServerInterceptor - .runWithSyncStatsCollection(new UnitTestClosure() { - - public void execute() { - context.commitChanges(); - } - }); - - assertEquals(1, stats.nodePropertiesChanged); - assertEquals(1, stats.nodesCreated); - } - - public void testComplimentaryArcs() { - - ClientMtTable1 o1 = context.newObject(ClientMtTable1.class); - ClientMtTable2 o2 = context.newObject(ClientMtTable2.class); - o2.setTable1(o1); - o2.setTable1(null); - - DataChannelSyncStats stats = clientServerInterceptor - .runWithSyncStatsCollection(new UnitTestClosure() { - - public void execute() { - context.commitChanges(); - } - }); - - assertEquals(0, stats.nodePropertiesChanged); - assertEquals(2, stats.nodesCreated); - assertEquals(0, stats.arcsCreated); - assertEquals(0, stats.arcsDeleted); - } - - public void testDelete() { - - ClientMtTable1 o1 = context.newObject(ClientMtTable1.class); - o1.setGlobalAttribute1("v1"); - context.deleteObjects(o1); - - DataChannelSyncStats stats = clientServerInterceptor - .runWithSyncStatsCollection(new UnitTestClosure() { - - public void execute() { - context.commitChanges(); - } - }); - assertEquals(0, stats.nodePropertiesChanged); - assertEquals(0, stats.nodesCreated); - assertEquals(0, stats.nodesRemoved); - } - -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fcb1d536/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextIT.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextIT.java new file mode 100644 index 0000000..588d56e --- /dev/null +++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextIT.java @@ -0,0 +1,351 @@ +/***************************************************************** + * 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.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; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) +public class CayenneContextIT 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/CayenneContextInheritanceIT.java ---------------------------------------------------------------------- diff --git a/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceIT.java b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceIT.java new file mode 100644 index 0000000..ec8c43a --- /dev/null +++ b/cayenne-client/src/test/java/org/apache/cayenne/CayenneContextInheritanceIT.java @@ -0,0 +1,151 @@ +/***************************************************************** + * 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.exp.ExpressionFactory; +import org.apache.cayenne.query.SelectQuery; +import org.apache.cayenne.test.jdbc.DBHelper; +import org.apache.cayenne.test.jdbc.TableHelper; +import org.apache.cayenne.testdo.mt.ClientMtTable1; +import org.apache.cayenne.testdo.mt.ClientMtTable1Subclass1; +import org.apache.cayenne.unit.di.client.ClientCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +import java.sql.Types; +import java.util.List; + +@UseServerRuntime(ClientCase.MULTI_TIER_PROJECT) +public class CayenneContextInheritanceIT extends ClientCase { + + @Inject + private DBHelper dbHelper; + + @Inject + private CayenneContext context; + + private TableHelper tMtTable1; + + @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", + "SUBCLASS_ATTRIBUTE1").setColumnTypes( + Types.INTEGER, + Types.VARCHAR, + Types.VARCHAR, + Types.VARCHAR); + } + + public void testInsertSubclass() throws Exception { + + ClientMtTable1Subclass1 object = context.newObject(ClientMtTable1Subclass1.class); + object.setGlobalAttribute1("sub1"); + object.setServerAttribute1("sa1"); + object.setSubclass1Attribute1("suba1"); + + context.commitChanges(); + + assertEquals(1, tMtTable1.getRowCount()); + assertEquals("sub1", tMtTable1.getString("GLOBAL_ATTRIBUTE1")); + assertEquals("sa1", tMtTable1.getString("SERVER_ATTRIBUTE1")); + assertEquals("suba1", tMtTable1.getString("SUBCLASS_ATTRIBUTE1")); + } + + public void testPerformQueryInheritanceLeaf() throws Exception { + + tMtTable1.insert(1, "xxx", "yyy", null); + tMtTable1.insert(2, "sub1", "zzz", "sa1"); + tMtTable1.insert(3, "1111", "aaa", null); + + SelectQuery query = new SelectQuery(ClientMtTable1Subclass1.class); + List<ClientMtTable1Subclass1> objects = context.performQuery(query); + + assertEquals(1, objects.size()); + assertEquals("sa1", objects.get(0).getSubclass1Attribute1()); + } + + public void testPerformQueryInheritanceSuper() throws Exception { + + tMtTable1.insert(1, "a", "yyy", null); + tMtTable1.insert(2, "sub1", "zzz", "sa1"); + tMtTable1.insert(3, "z", "aaa", null); + + SelectQuery query = new SelectQuery(ClientMtTable1.class); + List<ClientMtTable1> objects = context.performQuery(query); + + assertEquals(3, objects.size()); + + int checkedFields = 0; + for (int i = 0; i < objects.size(); i++) { + Integer id = (Integer) objects.get(i).getObjectId().getIdSnapshot().get( + "TABLE1_ID"); + if (id == 1) { + assertEquals("a", objects.get(i).getGlobalAttribute1()); + checkedFields++; + } + else if (id == 2) { + assertEquals("sa1", ((ClientMtTable1Subclass1) objects.get(i)) + .getSubclass1Attribute1()); + checkedFields++; + } + + } + assertEquals(2, checkedFields); + } + + public void testPerformQueryWithQualifierInheritanceSuper() throws Exception { + + tMtTable1.insert(1, "a", "XX", null); + tMtTable1.insert(2, "sub1", "XXA", "sa1"); + tMtTable1.insert(3, "z", "MM", null); + + SelectQuery query = new SelectQuery(ClientMtTable1.class); + query.andQualifier(ExpressionFactory.likeExp( + ClientMtTable1.SERVER_ATTRIBUTE1_PROPERTY, + "X%")); + List<ClientMtTable1> objects = context.performQuery(query); + + assertEquals(2, objects.size()); + + int checkedFields = 0; + for (int i = 0; i < objects.size(); i++) { + Integer id = (Integer) objects.get(i).getObjectId().getIdSnapshot().get( + "TABLE1_ID"); + if (id == 1) { + assertEquals("a", objects.get(i).getGlobalAttribute1()); + checkedFields++; + } + else if (id == 2) { + assertEquals("sa1", ((ClientMtTable1Subclass1) objects.get(i)) + .getSubclass1Attribute1()); + checkedFields++; + } + + } + assertEquals(2, checkedFields); + } + +}
