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:10:08 UTC
[20/48] Installing Maven Failsafe Plugin
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/NumericTypesTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/NumericTypesTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/NumericTypesTest.java
deleted file mode 100644
index 0a3a531..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/NumericTypesTest.java
+++ /dev/null
@@ -1,295 +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.access;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.List;
-
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-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.testmap.BigDecimalEntity;
-import org.apache.cayenne.testdo.testmap.BigIntegerEntity;
-import org.apache.cayenne.testdo.testmap.BitTestEntity;
-import org.apache.cayenne.testdo.testmap.BooleanTestEntity;
-import org.apache.cayenne.testdo.testmap.DecimalPKTest1;
-import org.apache.cayenne.testdo.testmap.DecimalPKTestEntity;
-import org.apache.cayenne.testdo.testmap.LongEntity;
-import org.apache.cayenne.testdo.testmap.SmallintTestEntity;
-import org.apache.cayenne.testdo.testmap.TinyintTestEntity;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-/**
- */
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class NumericTypesTest extends ServerCase {
-
- @Inject
- protected DataContext context;
-
- @Inject
- protected DataContext context1;
-
- @Inject
- protected ServerRuntime runtime;
-
- @Inject
- protected DBHelper dbHelper;
-
- protected TableHelper tSmallintTest;
- protected TableHelper tTinyintTest;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("BOOLEAN_TEST");
- dbHelper.deleteAll("SMALLINT_TEST");
- dbHelper.deleteAll("TINYINT_TEST");
- dbHelper.deleteAll("DECIMAL_PK_TST");
-
- tSmallintTest = new TableHelper(dbHelper, "SMALLINT_TEST");
- tSmallintTest.setColumns("ID", "SMALLINT_COL");
-
- tTinyintTest = new TableHelper(dbHelper, "TINYINT_TEST");
- tTinyintTest.setColumns("ID", "TINYINT_COL");
- }
-
- protected void createShortDataSet() throws Exception {
- tSmallintTest.insert(1, 9999);
- tSmallintTest.insert(2, 3333);
- }
-
- protected void createTinyintDataSet() throws Exception {
- tTinyintTest.insert(1, 81);
- tTinyintTest.insert(2, 50);
- }
-
- public void testLong() throws Exception {
-
- LongEntity test = context.newObject(LongEntity.class);
-
- Long i = new Long(Integer.MAX_VALUE + 10l);
- test.setLongField(i);
- context.commitChanges();
-
- SelectQuery q = new SelectQuery(LongEntity.class);
- LongEntity testRead = (LongEntity) context.performQuery(q).get(0);
- assertNotNull(testRead.getLongField());
- assertEquals(i, testRead.getLongField());
-
- test.setLongField(null);
- context.commitChanges();
- }
-
- public void testBigInteger() throws Exception {
-
- BigIntegerEntity test = context.newObject(BigIntegerEntity.class);
-
- BigInteger i = new BigInteger("1234567890");
- test.setBigIntegerField(i);
- context.commitChanges();
-
- SelectQuery q = new SelectQuery(BigIntegerEntity.class);
- BigIntegerEntity testRead = (BigIntegerEntity) context.performQuery(q).get(0);
- assertNotNull(testRead.getBigIntegerField());
- assertEquals(i, testRead.getBigIntegerField());
-
- test.setBigIntegerField(null);
- context.commitChanges();
- }
-
- public void testBigDecimal() throws Exception {
-
- BigDecimalEntity test = context.newObject(BigDecimalEntity.class);
-
- BigDecimal i = new BigDecimal("1234567890.44");
- test.setBigDecimalField(i);
- context.commitChanges();
-
- SelectQuery q = new SelectQuery(BigDecimalEntity.class);
- BigDecimalEntity testRead = (BigDecimalEntity) context.performQuery(q).get(0);
- assertNotNull(testRead.getBigDecimalField());
- assertEquals(i, testRead.getBigDecimalField());
-
- test.setBigDecimalField(null);
- context.commitChanges();
- }
-
- public void testShortInQualifier() throws Exception {
- createShortDataSet();
-
- // test
- Expression qual = ExpressionFactory.matchExp("smallintCol", new Short("9999"));
- List<?> objects = context.performQuery(new SelectQuery(
- SmallintTestEntity.class,
- qual));
- assertEquals(1, objects.size());
-
- SmallintTestEntity object = (SmallintTestEntity) objects.get(0);
- assertEquals(new Short("9999"), object.getSmallintCol());
- }
-
- public void testShortInInsert() throws Exception {
- SmallintTestEntity object = (SmallintTestEntity) (context)
- .newObject("SmallintTestEntity");
- object.setSmallintCol(new Short("1"));
- context.commitChanges();
- }
-
- public void testTinyintInQualifier() throws Exception {
- createTinyintDataSet();
-
- // test
- Expression qual = ExpressionFactory.matchExp("tinyintCol", new Byte((byte) 81));
- List<?> objects = context.performQuery(new SelectQuery(
- TinyintTestEntity.class,
- qual));
- assertEquals(1, objects.size());
-
- TinyintTestEntity object = (TinyintTestEntity) objects.get(0);
- assertEquals(new Byte((byte) 81), object.getTinyintCol());
- }
-
- public void testTinyintInInsert() throws Exception {
- TinyintTestEntity object = (TinyintTestEntity) (context)
- .newObject("TinyintTestEntity");
- object.setTinyintCol(new Byte((byte) 1));
- context.commitChanges();
- }
-
- public void testBooleanBit() throws Exception {
-
- BitTestEntity trueObject = (BitTestEntity) context.newObject("BitTestEntity");
- trueObject.setBitColumn(Boolean.TRUE);
- BitTestEntity falseObject = (BitTestEntity) context.newObject("BitTestEntity");
- falseObject.setBitColumn(Boolean.FALSE);
- context.commitChanges();
- context.invalidateObjects(trueObject, falseObject);
-
- // fetch true...
- Expression trueQ = ExpressionFactory.matchExp("bitColumn", Boolean.TRUE);
- List<?> trueResult = context1.performQuery(new SelectQuery(
- BitTestEntity.class,
- trueQ));
- assertEquals(1, trueResult.size());
-
- BitTestEntity trueRefetched = (BitTestEntity) trueResult.get(0);
- assertEquals(Boolean.TRUE, trueRefetched.getBitColumn());
-
- // CAY-320. Simplifying the use of booleans to allow identity comparison.
- assertNotSame(trueRefetched, trueObject);
- assertSame(Boolean.TRUE, trueRefetched.getBitColumn());
-
- // fetch false
- Expression falseQ = ExpressionFactory.matchExp("bitColumn", Boolean.FALSE);
- List<?> falseResult = context1.performQuery(new SelectQuery(
- BitTestEntity.class,
- falseQ));
- assertEquals(1, falseResult.size());
-
- BitTestEntity falseRefetched = (BitTestEntity) falseResult.get(0);
- assertEquals(Boolean.FALSE, falseRefetched.getBitColumn());
-
- // CAY-320. Simplifying the use of booleans to allow identity comparison.
- assertNotSame(falseRefetched, falseObject);
- assertSame(Boolean.FALSE, falseRefetched.getBitColumn());
- }
-
- public void testBooleanBoolean() throws Exception {
-
- // populate (testing insert as well)
- BooleanTestEntity trueObject = (BooleanTestEntity) context
- .newObject("BooleanTestEntity");
- trueObject.setBooleanColumn(Boolean.TRUE);
- BooleanTestEntity falseObject = (BooleanTestEntity) context
- .newObject("BooleanTestEntity");
- falseObject.setBooleanColumn(Boolean.FALSE);
- context.commitChanges();
-
- context.invalidateObjects(trueObject, falseObject);
-
- // fetch true...
- Expression trueQ = ExpressionFactory.matchExp("booleanColumn", Boolean.TRUE);
- List<?> trueResult = context1.performQuery(new SelectQuery(
- BooleanTestEntity.class,
- trueQ));
- assertEquals(1, trueResult.size());
-
- BooleanTestEntity trueRefetched = (BooleanTestEntity) trueResult.get(0);
- assertEquals(Boolean.TRUE, trueRefetched.getBooleanColumn());
-
- // CAY-320. Simplifying the use of booleans to allow identity comparison.
- assertNotSame(trueRefetched, trueObject);
- assertSame(Boolean.TRUE, trueRefetched.getBooleanColumn());
-
- // fetch false
- Expression falseQ = ExpressionFactory.matchExp("booleanColumn", Boolean.FALSE);
- List<?> falseResult = context1.performQuery(new SelectQuery(
- BooleanTestEntity.class,
- falseQ));
- assertEquals(1, falseResult.size());
-
- BooleanTestEntity falseRefetched = (BooleanTestEntity) falseResult.get(0);
- assertEquals(Boolean.FALSE, falseRefetched.getBooleanColumn());
-
- // CAY-320. Simplifying the use of booleans to allow identity comparison.
- assertNotSame(falseRefetched, falseObject);
- assertSame(Boolean.FALSE, falseRefetched.getBooleanColumn());
- }
-
- public void testDecimalPK() throws Exception {
-
- // populate (testing insert as well)
- DecimalPKTestEntity object = context.newObject(DecimalPKTestEntity.class);
-
- object.setName("o1");
- object.setDecimalPK(new BigDecimal("1.25"));
- context.commitChanges();
-
- ObjectId syntheticId = new ObjectId(
- "DecimalPKTestEntity",
- "DECIMAL_PK",
- new BigDecimal("1.25"));
- assertSame(object, context.getGraphManager().getNode(syntheticId));
-
- context.deleteObjects(object);
- context.commitChanges();
- }
-
- public void testDecimalPK1() throws Exception {
-
- // populate (testing insert as well)
- DecimalPKTest1 object = context.newObject(DecimalPKTest1.class);
-
- object.setName("o2");
- object.setDecimalPK(new Double(1.25));
- context.commitChanges();
-
- ObjectId syntheticId = new ObjectId("DecimalPKTest1", "DECIMAL_PK", new Double(
- 1.25));
- assertSame(object, context.getGraphManager().getNode(syntheticId));
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreDiffRetainingIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreDiffRetainingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreDiffRetainingIT.java
new file mode 100644
index 0000000..f8b11d7
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreDiffRetainingIT.java
@@ -0,0 +1,107 @@
+/*****************************************************************
+ * 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.access;
+
+import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.sql.Types;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class ObjectStoreDiffRetainingIT extends ServerCase {
+
+ @Inject
+ protected DataContext context;
+
+ @Inject
+ protected DBHelper dbHelper;
+
+ protected TableHelper tArtist;
+ protected TableHelper tPainting;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("PAINTING_INFO");
+ dbHelper.deleteAll("PAINTING");
+ dbHelper.deleteAll("ARTIST_EXHIBIT");
+ dbHelper.deleteAll("ARTIST_GROUP");
+ dbHelper.deleteAll("ARTIST");
+
+ tArtist = new TableHelper(dbHelper, "ARTIST");
+ tArtist.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH")
+ .setColumnTypes(Types.BIGINT, Types.CHAR, Types.DATE);
+
+ tPainting = new TableHelper(dbHelper, "PAINTING");
+ tPainting.setColumns(
+ "ARTIST_ID",
+ "ESTIMATED_PRICE",
+ "GALLERY_ID",
+ "PAINTING_ID",
+ "PAINTING_TITLE").setColumnTypes(
+ Types.BIGINT,
+ Types.DECIMAL,
+ Types.INTEGER,
+ Types.INTEGER,
+ Types.VARCHAR);
+ }
+
+ protected void createMixedDataSet() throws Exception {
+ tArtist.insert(2000, "artist with one painting", null);
+ tPainting.insert(2000, null, null, 3000, "p1");
+ }
+
+ public void testSnapshotRetainedOnPropertyModification() throws Exception {
+ createMixedDataSet();
+
+ Artist a = Cayenne.objectForPK(context, Artist.class, 2000);
+ ObjectStore objectStore = context.getObjectStore();
+
+ assertNull(objectStore.getChangesByObjectId().get(a.getObjectId()));
+
+ a.setArtistName("some other name");
+ assertNotNull(objectStore.getChangesByObjectId().get(a.getObjectId()));
+ }
+
+ public void testSnapshotRetainedOnRelAndPropertyModification() throws Exception {
+ createMixedDataSet();
+
+ Artist a = Cayenne.objectForPK(context, Artist.class, 2000);
+ ObjectStore objectStore = context.getObjectStore();
+
+ assertNull(objectStore.getChangesByObjectId().get(a.getObjectId()));
+
+ // we are trying to reproduce the bug CAY-213 - relationship modification puts
+ // object in a modified state, so later when object is really modified, its
+ // snapshot is not retained... in testing this I am leaving some flexibility for
+ // the framework to retain a snapshot when it deems appropriate...
+
+ a.addToPaintingArray(context.newObject(Painting.class));
+ a.setArtistName("some other name");
+ assertNotNull("Snapshot wasn't retained - CAY-213", objectStore
+ .getChangesByObjectId()
+ .get(a.getObjectId()));
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreDiffRetainingTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreDiffRetainingTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreDiffRetainingTest.java
deleted file mode 100644
index cdd4f5d..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreDiffRetainingTest.java
+++ /dev/null
@@ -1,107 +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.access;
-
-import java.sql.Types;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class ObjectStoreDiffRetainingTest extends ServerCase {
-
- @Inject
- protected DataContext context;
-
- @Inject
- protected DBHelper dbHelper;
-
- protected TableHelper tArtist;
- protected TableHelper tPainting;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("PAINTING_INFO");
- dbHelper.deleteAll("PAINTING");
- dbHelper.deleteAll("ARTIST_EXHIBIT");
- dbHelper.deleteAll("ARTIST_GROUP");
- dbHelper.deleteAll("ARTIST");
-
- tArtist = new TableHelper(dbHelper, "ARTIST");
- tArtist.setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH")
- .setColumnTypes(Types.BIGINT, Types.CHAR, Types.DATE);
-
- tPainting = new TableHelper(dbHelper, "PAINTING");
- tPainting.setColumns(
- "ARTIST_ID",
- "ESTIMATED_PRICE",
- "GALLERY_ID",
- "PAINTING_ID",
- "PAINTING_TITLE").setColumnTypes(
- Types.BIGINT,
- Types.DECIMAL,
- Types.INTEGER,
- Types.INTEGER,
- Types.VARCHAR);
- }
-
- protected void createMixedDataSet() throws Exception {
- tArtist.insert(2000, "artist with one painting", null);
- tPainting.insert(2000, null, null, 3000, "p1");
- }
-
- public void testSnapshotRetainedOnPropertyModification() throws Exception {
- createMixedDataSet();
-
- Artist a = Cayenne.objectForPK(context, Artist.class, 2000);
- ObjectStore objectStore = context.getObjectStore();
-
- assertNull(objectStore.getChangesByObjectId().get(a.getObjectId()));
-
- a.setArtistName("some other name");
- assertNotNull(objectStore.getChangesByObjectId().get(a.getObjectId()));
- }
-
- public void testSnapshotRetainedOnRelAndPropertyModification() throws Exception {
- createMixedDataSet();
-
- Artist a = Cayenne.objectForPK(context, Artist.class, 2000);
- ObjectStore objectStore = context.getObjectStore();
-
- assertNull(objectStore.getChangesByObjectId().get(a.getObjectId()));
-
- // we are trying to reproduce the bug CAY-213 - relationship modification puts
- // object in a modified state, so later when object is really modified, its
- // snapshot is not retained... in testing this I am leaving some flexibility for
- // the framework to retain a snapshot when it deems appropriate...
-
- a.addToPaintingArray(context.newObject(Painting.class));
- a.setArtistName("some other name");
- assertNotNull("Snapshot wasn't retained - CAY-213", objectStore
- .getChangesByObjectId()
- .get(a.getObjectId()));
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreGCIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreGCIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreGCIT.java
new file mode 100644
index 0000000..86e8ede
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreGCIT.java
@@ -0,0 +1,130 @@
+/*****************************************************************
+ * 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.access;
+
+import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.SQLTemplate;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.parallel.ParallelTestContainer;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class ObjectStoreGCIT extends ServerCase {
+
+ @Inject
+ private DataContext context;
+
+ @Inject
+ private DBHelper dbHelper;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("PAINTING_INFO");
+ dbHelper.deleteAll("PAINTING");
+ dbHelper.deleteAll("ARTIST_EXHIBIT");
+ dbHelper.deleteAll("ARTIST_GROUP");
+ dbHelper.deleteAll("ARTIST");
+ }
+
+ public void testReleaseUnreferenced() throws Exception {
+ context.performGenericQuery(new SQLTemplate(
+ Artist.class,
+ "insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (1, 'aa')"));
+
+ assertEquals(0, context.getObjectStore().registeredObjectsCount());
+ context.performQuery(new SelectQuery(Artist.class));
+ assertEquals(1, context.getObjectStore().registeredObjectsCount());
+
+ // allow for slow GC
+ new ParallelTestContainer() {
+
+ @Override
+ protected void assertResult() throws Exception {
+ System.gc();
+ assertEquals(0, context.getObjectStore().registeredObjectsCount());
+ }
+ }.runTest(2000);
+ }
+
+ public void testRetainUnreferencedNew() throws Exception {
+ assertEquals(0, context.getObjectStore().registeredObjectsCount());
+ Artist a = context.newObject(Artist.class);
+ a.setArtistName("X");
+ a = null;
+ assertEquals(1, context.getObjectStore().registeredObjectsCount());
+
+ // allow for slow GC
+ new ParallelTestContainer() {
+
+ @Override
+ protected void assertResult() throws Exception {
+ System.gc();
+ assertEquals(1, context.getObjectStore().registeredObjectsCount());
+ }
+ }.runTest(2000);
+
+ assertEquals(1, context.getObjectStore().registeredObjectsCount());
+ context.commitChanges();
+ new ParallelTestContainer() {
+
+ @Override
+ protected void assertResult() throws Exception {
+ System.gc();
+ assertEquals(0, context.getObjectStore().registeredObjectsCount());
+ }
+ }.runTest(2000);
+
+ }
+
+ public void testRetainUnreferencedModified() throws Exception {
+ context.performGenericQuery(new SQLTemplate(
+ Artist.class,
+ "insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (1, 'aa')"));
+
+ assertEquals(0, context.getObjectStore().registeredObjectsCount());
+ Artist a = Cayenne.objectForPK(context, Artist.class, 1);
+ a.setArtistName("Y");
+ a = null;
+ assertEquals(1, context.getObjectStore().registeredObjectsCount());
+
+ new ParallelTestContainer() {
+
+ @Override
+ protected void assertResult() throws Exception {
+ System.gc();
+ assertEquals(1, context.getObjectStore().registeredObjectsCount());
+ }
+ }.runTest(2000);
+
+ context.commitChanges();
+ new ParallelTestContainer() {
+
+ @Override
+ protected void assertResult() throws Exception {
+ System.gc();
+ assertEquals(0, context.getObjectStore().registeredObjectsCount());
+ }
+ }.runTest(2000);
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreGCTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreGCTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreGCTest.java
deleted file mode 100644
index fe6bce0..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreGCTest.java
+++ /dev/null
@@ -1,130 +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.access;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.parallel.ParallelTestContainer;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class ObjectStoreGCTest extends ServerCase {
-
- @Inject
- private DataContext context;
-
- @Inject
- private DBHelper dbHelper;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("PAINTING_INFO");
- dbHelper.deleteAll("PAINTING");
- dbHelper.deleteAll("ARTIST_EXHIBIT");
- dbHelper.deleteAll("ARTIST_GROUP");
- dbHelper.deleteAll("ARTIST");
- }
-
- public void testReleaseUnreferenced() throws Exception {
- context.performGenericQuery(new SQLTemplate(
- Artist.class,
- "insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (1, 'aa')"));
-
- assertEquals(0, context.getObjectStore().registeredObjectsCount());
- context.performQuery(new SelectQuery(Artist.class));
- assertEquals(1, context.getObjectStore().registeredObjectsCount());
-
- // allow for slow GC
- new ParallelTestContainer() {
-
- @Override
- protected void assertResult() throws Exception {
- System.gc();
- assertEquals(0, context.getObjectStore().registeredObjectsCount());
- }
- }.runTest(2000);
- }
-
- public void testRetainUnreferencedNew() throws Exception {
- assertEquals(0, context.getObjectStore().registeredObjectsCount());
- Artist a = context.newObject(Artist.class);
- a.setArtistName("X");
- a = null;
- assertEquals(1, context.getObjectStore().registeredObjectsCount());
-
- // allow for slow GC
- new ParallelTestContainer() {
-
- @Override
- protected void assertResult() throws Exception {
- System.gc();
- assertEquals(1, context.getObjectStore().registeredObjectsCount());
- }
- }.runTest(2000);
-
- assertEquals(1, context.getObjectStore().registeredObjectsCount());
- context.commitChanges();
- new ParallelTestContainer() {
-
- @Override
- protected void assertResult() throws Exception {
- System.gc();
- assertEquals(0, context.getObjectStore().registeredObjectsCount());
- }
- }.runTest(2000);
-
- }
-
- public void testRetainUnreferencedModified() throws Exception {
- context.performGenericQuery(new SQLTemplate(
- Artist.class,
- "insert into ARTIST (ARTIST_ID, ARTIST_NAME) values (1, 'aa')"));
-
- assertEquals(0, context.getObjectStore().registeredObjectsCount());
- Artist a = Cayenne.objectForPK(context, Artist.class, 1);
- a.setArtistName("Y");
- a = null;
- assertEquals(1, context.getObjectStore().registeredObjectsCount());
-
- new ParallelTestContainer() {
-
- @Override
- protected void assertResult() throws Exception {
- System.gc();
- assertEquals(1, context.getObjectStore().registeredObjectsCount());
- }
- }.runTest(2000);
-
- context.commitChanges();
- new ParallelTestContainer() {
-
- @Override
- protected void assertResult() throws Exception {
- System.gc();
- assertEquals(0, context.getObjectStore().registeredObjectsCount());
- }
- }.runTest(2000);
-
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreIT.java
new file mode 100644
index 0000000..8e24d38
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreIT.java
@@ -0,0 +1,133 @@
+/*****************************************************************
+ * 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.access;
+
+import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.DataObject;
+import org.apache.cayenne.DataRow;
+import org.apache.cayenne.MockDataObject;
+import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.testdo.testmap.Gallery;
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.Collections;
+import java.util.Date;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class ObjectStoreIT extends ServerCase {
+
+ @Inject
+ private DataContext context;
+
+ public void testRegisteredObjectsCount() throws Exception {
+
+ assertEquals(0, context.getObjectStore().registeredObjectsCount());
+
+ DataObject o1 = new MockDataObject();
+ o1.setObjectId(new ObjectId("T", "key1", "v1"));
+ context.getObjectStore().registerNode(o1.getObjectId(), o1);
+ assertEquals(1, context.getObjectStore().registeredObjectsCount());
+
+ // test object with same id
+ DataObject o2 = new MockDataObject();
+ o2.setObjectId(new ObjectId("T", "key1", "v1"));
+ context.getObjectStore().registerNode(o2.getObjectId(), o2);
+ assertEquals(1, context.getObjectStore().registeredObjectsCount());
+
+ // test new object
+ DataObject o3 = new MockDataObject();
+ o3.setObjectId(new ObjectId("T", "key3", "v3"));
+ context.getObjectStore().registerNode(o3.getObjectId(), o3);
+ assertEquals(2, context.getObjectStore().registeredObjectsCount());
+ }
+
+ public void testObjectsUnregistered() throws Exception {
+
+ DataRow row = new DataRow(10);
+ row.put("ARTIST_ID", new Integer(1));
+ row.put("ARTIST_NAME", "ArtistXYZ");
+ row.put("DATE_OF_BIRTH", new Date());
+ DataObject object = context.objectFromDataRow(Artist.class, row);
+ ObjectId oid = object.getObjectId();
+
+ // insert object into the ObjectStore
+ context.getObjectStore().registerNode(oid, object);
+ assertSame(object, context.getObjectStore().getNode(oid));
+ assertNotNull(context.getObjectStore().getCachedSnapshot(oid));
+
+ context.getObjectStore().objectsUnregistered(Collections.singletonList(object));
+
+ assertNull(object.getObjectId());
+ assertNull(context.getObjectStore().getNode(oid));
+
+ // in the future this may not be the case
+ assertNull(context.getObjectStore().getCachedSnapshot(oid));
+ }
+
+ public void testUnregisterThenRegister() throws Exception {
+
+ // Create a gallery.
+ Gallery g = context.newObject(Gallery.class);
+ g.setGalleryName("Test Gallery");
+
+ // Create an artist in the same context.
+ Artist a = context.newObject(Artist.class);
+ a.setArtistName("Test Artist");
+
+ // Create a painting in the same context.
+ Painting p = context.newObject(Painting.class);
+ p.setPaintingTitle("Test Painting");
+
+ // Set the painting's gallery.
+ p.setToGallery(g);
+ assertEquals(g, p.getToGallery());
+
+ // Unregister the painting from the context.
+ context.unregisterObjects(Collections.singletonList(p));
+
+ // Make sure that even though the painting has been removed from the context's
+ // object graph that the reference to the gallery is the same.
+ assertEquals(g, p.getToGallery());
+
+ // Now, set the relationship between "p" & "a." Since "p" is not registered with a
+ // context, but "a" is, "p" should be auto-registered with the context of "a."
+ p.setToArtist(a);
+
+ // Now commit the gallery, artist, & painting.
+ context.commitChanges();
+
+ // Check one last time that the painting's gallery is set to what we expect.
+ assertEquals(g, p.getToGallery());
+
+ // Now, retrieve the same painting from the DB. Note that the gallery relationship
+ // is null even though according to our painting, that should not be the case; a
+ // NULL
+ // value has been recorded to the DB for the painting's gallery_id field.
+ //
+ // The full object graph is not being re-registered during auto-registration
+ // with the context.
+ Painting newP = (Painting) Cayenne.objectForPK(context, p.getObjectId());
+ assertNotNull(newP.getToGallery());
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreTest.java
deleted file mode 100644
index f270ff4..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/ObjectStoreTest.java
+++ /dev/null
@@ -1,133 +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.access;
-
-import java.util.Collections;
-import java.util.Date;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.DataObject;
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.MockDataObject;
-import org.apache.cayenne.ObjectId;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class ObjectStoreTest extends ServerCase {
-
- @Inject
- private DataContext context;
-
- public void testRegisteredObjectsCount() throws Exception {
-
- assertEquals(0, context.getObjectStore().registeredObjectsCount());
-
- DataObject o1 = new MockDataObject();
- o1.setObjectId(new ObjectId("T", "key1", "v1"));
- context.getObjectStore().registerNode(o1.getObjectId(), o1);
- assertEquals(1, context.getObjectStore().registeredObjectsCount());
-
- // test object with same id
- DataObject o2 = new MockDataObject();
- o2.setObjectId(new ObjectId("T", "key1", "v1"));
- context.getObjectStore().registerNode(o2.getObjectId(), o2);
- assertEquals(1, context.getObjectStore().registeredObjectsCount());
-
- // test new object
- DataObject o3 = new MockDataObject();
- o3.setObjectId(new ObjectId("T", "key3", "v3"));
- context.getObjectStore().registerNode(o3.getObjectId(), o3);
- assertEquals(2, context.getObjectStore().registeredObjectsCount());
- }
-
- public void testObjectsUnregistered() throws Exception {
-
- DataRow row = new DataRow(10);
- row.put("ARTIST_ID", new Integer(1));
- row.put("ARTIST_NAME", "ArtistXYZ");
- row.put("DATE_OF_BIRTH", new Date());
- DataObject object = context.objectFromDataRow(Artist.class, row);
- ObjectId oid = object.getObjectId();
-
- // insert object into the ObjectStore
- context.getObjectStore().registerNode(oid, object);
- assertSame(object, context.getObjectStore().getNode(oid));
- assertNotNull(context.getObjectStore().getCachedSnapshot(oid));
-
- context.getObjectStore().objectsUnregistered(Collections.singletonList(object));
-
- assertNull(object.getObjectId());
- assertNull(context.getObjectStore().getNode(oid));
-
- // in the future this may not be the case
- assertNull(context.getObjectStore().getCachedSnapshot(oid));
- }
-
- public void testUnregisterThenRegister() throws Exception {
-
- // Create a gallery.
- Gallery g = context.newObject(Gallery.class);
- g.setGalleryName("Test Gallery");
-
- // Create an artist in the same context.
- Artist a = context.newObject(Artist.class);
- a.setArtistName("Test Artist");
-
- // Create a painting in the same context.
- Painting p = context.newObject(Painting.class);
- p.setPaintingTitle("Test Painting");
-
- // Set the painting's gallery.
- p.setToGallery(g);
- assertEquals(g, p.getToGallery());
-
- // Unregister the painting from the context.
- context.unregisterObjects(Collections.singletonList(p));
-
- // Make sure that even though the painting has been removed from the context's
- // object graph that the reference to the gallery is the same.
- assertEquals(g, p.getToGallery());
-
- // Now, set the relationship between "p" & "a." Since "p" is not registered with a
- // context, but "a" is, "p" should be auto-registered with the context of "a."
- p.setToArtist(a);
-
- // Now commit the gallery, artist, & painting.
- context.commitChanges();
-
- // Check one last time that the painting's gallery is set to what we expect.
- assertEquals(g, p.getToGallery());
-
- // Now, retrieve the same painting from the DB. Note that the gallery relationship
- // is null even though according to our painting, that should not be the case; a
- // NULL
- // value has been recorded to the DB for the painting's gallery_id field.
- //
- // The full object graph is not being re-registered during auto-registration
- // with the context.
- Painting newP = (Painting) Cayenne.objectForPK(context, p.getObjectId());
- assertNotNull(newP.getToGallery());
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java
new file mode 100644
index 0000000..b345f2a
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingIT.java
@@ -0,0 +1,498 @@
+/*****************************************************************
+ * 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.access;
+
+import java.sql.Types;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.Ordering;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.SortOrder;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.locking.RelLockingTestEntity;
+import org.apache.cayenne.testdo.locking.SimpleLockingTestEntity;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ServerCase.LOCKING_PROJECT)
+public class OptimisticLockingIT extends ServerCase {
+
+ @Inject
+ protected DataContext context;
+
+ @Inject
+ protected DBHelper dbHelper;
+
+ protected TableHelper tSimpleLockingTest;
+ protected TableHelper tRelLockingTest;
+ protected TableHelper tLockingHelper;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("LOCKING_HELPER");
+ dbHelper.deleteAll("REL_LOCKING_TEST");
+ dbHelper.deleteAll("SIMPLE_LOCKING_TEST");
+
+ tSimpleLockingTest = new TableHelper(dbHelper, "SIMPLE_LOCKING_TEST");
+ tSimpleLockingTest.setColumns("LOCKING_TEST_ID", "NAME", "DESCRIPTION")
+ .setColumnTypes(Types.INTEGER, Types.VARCHAR, Types.VARCHAR);
+
+ tRelLockingTest = new TableHelper(dbHelper, "REL_LOCKING_TEST");
+ tRelLockingTest.setColumns(
+ "REL_LOCKING_TEST_ID",
+ "SIMPLE_LOCKING_TEST_ID",
+ "NAME");
+
+ tLockingHelper = new TableHelper(dbHelper, "LOCKING_HELPER");
+ tLockingHelper.setColumns("LOCKING_HELPER_ID", "REL_LOCKING_TEST_ID", "NAME");
+ }
+
+ protected void createSimpleLockingDataSet() throws Exception {
+ tLockingHelper.delete().execute();
+ tRelLockingTest.delete().execute();
+ tSimpleLockingTest.delete().execute();
+ tSimpleLockingTest.insert(1, "LockTest1", null);
+ }
+
+ protected void createLockingOnNullDataSet() throws Exception {
+ tLockingHelper.delete().execute();
+ tRelLockingTest.delete().execute();
+ tSimpleLockingTest.delete().execute();
+ tSimpleLockingTest.insert(1, null, null);
+ }
+
+ protected void createLockingOnMixedDataSet() throws Exception {
+ tLockingHelper.delete().execute();
+ tRelLockingTest.delete().execute();
+ tSimpleLockingTest.delete().execute();
+ tSimpleLockingTest.insert(1, null, null);
+ tSimpleLockingTest.insert(2, "LockTest2", null);
+ tSimpleLockingTest.insert(3, "LockTest3", "Another Lock Test");
+ }
+
+ protected void createLockingOnToOneDataSet() throws Exception {
+ tLockingHelper.delete().execute();
+ tRelLockingTest.delete().execute();
+ tSimpleLockingTest.delete().execute();
+ tSimpleLockingTest.insert(1, "LockTest1", null);
+ tRelLockingTest.insert(5, 1, "Rel Test 1");
+ tLockingHelper.insert(1, 5, "Locking Helper 1");
+ }
+
+ protected void createSimpleLockUpdate() throws Exception {
+ assertEquals(1, tSimpleLockingTest
+ .update()
+ .set("NAME", "LockTest1Updated")
+ .where("LOCKING_TEST_ID", 1)
+ .execute());
+ }
+
+ protected void createRelLockUpdate() throws Exception {
+ tRelLockingTest.update().set("SIMPLE_LOCKING_TEST_ID", 1).where(
+ "REL_LOCKING_TEST_ID",
+ 5).execute();
+ }
+
+ protected void createSimpleLockDelete() throws Exception {
+ tSimpleLockingTest.delete().execute();
+ }
+
+ public void testSuccessSimpleLockingOnDelete() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ context.deleteObjects(object);
+ context.commitChanges();
+ }
+
+ public void testSuccessSimpleLockingOnDeleteFollowedByInvalidate() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ context.deleteObjects(object);
+ context.invalidateObjects(object);
+ context.commitChanges();
+ }
+
+ public void testSuccessSimpleLockingOnDeleteFollowedByForgetSnapshot()
+ throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ context.deleteObjects(object);
+ context.getObjectStore().getDataRowCache().forgetSnapshot(object.getObjectId());
+ context.commitChanges();
+ }
+
+ public void testSuccessSimpleLockingOnDeletePrecededByInvalidate() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ context.invalidateObjects(object);
+ context.deleteObjects(object);
+ context.commitChanges();
+ }
+
+ public void testSuccessSimpleLockingOnDeletePrecededByForgetSnapshot()
+ throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ context.getObjectStore().getDataRowCache().forgetSnapshot(object.getObjectId());
+ context.deleteObjects(object);
+ context.commitChanges();
+ }
+
+ public void testFailSimpleLockingOnDelete() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("second update");
+ context.commitChanges();
+
+ // change row underneath, delete and save... optimistic lock failure expected
+ createSimpleLockUpdate();
+
+ context.deleteObjects(object);
+
+ try {
+ context.commitChanges();
+ fail("Optimistic lock failure expected.");
+ }
+ catch (OptimisticLockException ex) {
+ // optimistic lock failure expected...
+ }
+ }
+
+ public void testSuccessSimpleLockingOnUpdate() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ object.setDescription("second update");
+
+ context.commitChanges();
+ }
+
+ public void testSuccessSimpleLockingOnUpdateFollowedByInvalidate() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ object.setDescription("second update");
+ context.invalidateObjects(object);
+
+ context.commitChanges();
+ }
+
+ public void testSuccessSimpleLockingOnUpdatePrecededByInvalidate() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ context.invalidateObjects(object);
+ object.setDescription("second update");
+
+ context.commitChanges();
+ }
+
+ public void testSuccessSimpleLockingOnUpdateFollowedByForgetSnapshot()
+ throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ object.setDescription("second update");
+ context.getObjectStore().getDataRowCache().forgetSnapshot(object.getObjectId());
+
+ context.commitChanges();
+ }
+
+ public void testSuccessSimpleLockingOnUpdatePrecededByForgetSnapshot()
+ throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ context.getObjectStore().getDataRowCache().forgetSnapshot(object.getObjectId());
+ object.setDescription("second update");
+
+ context.commitChanges();
+ }
+
+ public void testFailSimpleLocking() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected
+ object.setDescription("first update");
+ context.commitChanges();
+
+ // change row underneath, change description and save... optimistic lock failure
+ // expected
+ createSimpleLockUpdate();
+
+ object.setDescription("second update");
+
+ try {
+ context.commitChanges();
+ fail("Optimistic lock failure expected.");
+ }
+ catch (OptimisticLockException ex) {
+ // optimistic lock failure expected...
+ }
+ }
+
+ public void testFailLockingOnNull() throws Exception {
+ createLockingOnNullDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ // change description and save... no optimistic lock failure expected...
+ object.setDescription("first update");
+ context.commitChanges();
+
+ // change row underneath, change description and save... optimistic lock failure
+ // expected
+ createSimpleLockUpdate();
+
+ object.setDescription("second update");
+
+ try {
+ context.commitChanges();
+ fail("Optimistic lock failure expected.");
+ }
+ catch (OptimisticLockException ex) {
+ // optimistic lock failure expected...
+ assertEquals(object.getObjectId(), ex.getFailedObjectId());
+ }
+ }
+
+ public void testSuccessLockingOnMixed() throws Exception {
+ createLockingOnMixedDataSet();
+
+ SelectQuery query = new SelectQuery(SimpleLockingTestEntity.class);
+ query.addOrdering(new Ordering("db:LOCKING_TEST_ID", SortOrder.ASCENDING));
+
+ List<?> allObjects = context.performQuery(query);
+ assertEquals(3, allObjects.size());
+
+ SimpleLockingTestEntity object1 = (SimpleLockingTestEntity) allObjects.get(0);
+ SimpleLockingTestEntity object2 = (SimpleLockingTestEntity) allObjects.get(1);
+ SimpleLockingTestEntity object3 = (SimpleLockingTestEntity) allObjects.get(2);
+
+ // change description and save... no optimistic lock failure expected...
+ object1.setDescription("first update for object1");
+ object2.setDescription("first update for object2");
+ object3.setName("object3 - new name");
+ context.commitChanges();
+
+ // TODO: it would be nice to pick inside DataContext to see that 3 batches where
+ // generated...
+ // this requires refactoring of ContextCommit.
+ }
+
+ public void testFailLockingOnToOne() throws Exception {
+ createLockingOnToOneDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ RelLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ RelLockingTestEntity object = (RelLockingTestEntity) allObjects.get(0);
+
+ // change name and save... no optimistic lock failure expected
+ object.setName("first update");
+ context.commitChanges();
+
+ // change relationship and save... no optimistic lock failure expected
+ SimpleLockingTestEntity object1 = context
+ .newObject(SimpleLockingTestEntity.class);
+ object.setToSimpleLockingTest(object1);
+ context.commitChanges();
+
+ // change row underneath, change description and save... optimistic lock failure
+ // expected
+ createRelLockUpdate();
+
+ object.setName("third update");
+
+ try {
+ context.commitChanges();
+ fail("Optimistic lock failure expected.");
+ }
+ catch (OptimisticLockException ex) {
+ // optimistic lock failure expected...
+ }
+ }
+
+ public void testFailRetrieveRow() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+ object.setDescription("first update");
+
+ // change row underneath, change description and save... optimistic lock failure
+ // expected
+ createSimpleLockUpdate();
+
+ try {
+ context.commitChanges();
+ fail("Optimistic lock failure expected.");
+ }
+ catch (OptimisticLockException ex) {
+ Map<?, ?> freshFailedRow = ex.getFreshSnapshot(context);
+ assertNotNull(freshFailedRow);
+ assertEquals("LockTest1Updated", freshFailedRow.get("NAME"));
+ }
+ }
+
+ public void testFailRetrieveDeletedRow() throws Exception {
+ createSimpleLockingDataSet();
+
+ List<?> allObjects = context.performQuery(new SelectQuery(
+ SimpleLockingTestEntity.class));
+ assertEquals(1, allObjects.size());
+
+ SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
+
+ object.setDescription("first update");
+
+ // delete row underneath, change description and save... optimistic lock failure
+ // expected
+ createSimpleLockDelete();
+
+ try {
+ context.commitChanges();
+ fail("Optimistic lock failure expected.");
+ }
+ catch (OptimisticLockException ex) {
+ Map<?, ?> freshFailedRow = ex.getFreshSnapshot(context);
+ assertNull("" + freshFailedRow, freshFailedRow);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingTest.java
deleted file mode 100644
index eff2363..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/OptimisticLockingTest.java
+++ /dev/null
@@ -1,498 +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.access;
-
-import java.sql.Types;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.Ordering;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.locking.RelLockingTestEntity;
-import org.apache.cayenne.testdo.locking.SimpleLockingTestEntity;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.LOCKING_PROJECT)
-public class OptimisticLockingTest extends ServerCase {
-
- @Inject
- protected DataContext context;
-
- @Inject
- protected DBHelper dbHelper;
-
- protected TableHelper tSimpleLockingTest;
- protected TableHelper tRelLockingTest;
- protected TableHelper tLockingHelper;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("LOCKING_HELPER");
- dbHelper.deleteAll("REL_LOCKING_TEST");
- dbHelper.deleteAll("SIMPLE_LOCKING_TEST");
-
- tSimpleLockingTest = new TableHelper(dbHelper, "SIMPLE_LOCKING_TEST");
- tSimpleLockingTest.setColumns("LOCKING_TEST_ID", "NAME", "DESCRIPTION")
- .setColumnTypes(Types.INTEGER, Types.VARCHAR, Types.VARCHAR);
-
- tRelLockingTest = new TableHelper(dbHelper, "REL_LOCKING_TEST");
- tRelLockingTest.setColumns(
- "REL_LOCKING_TEST_ID",
- "SIMPLE_LOCKING_TEST_ID",
- "NAME");
-
- tLockingHelper = new TableHelper(dbHelper, "LOCKING_HELPER");
- tLockingHelper.setColumns("LOCKING_HELPER_ID", "REL_LOCKING_TEST_ID", "NAME");
- }
-
- protected void createSimpleLockingDataSet() throws Exception {
- tLockingHelper.delete().execute();
- tRelLockingTest.delete().execute();
- tSimpleLockingTest.delete().execute();
- tSimpleLockingTest.insert(1, "LockTest1", null);
- }
-
- protected void createLockingOnNullDataSet() throws Exception {
- tLockingHelper.delete().execute();
- tRelLockingTest.delete().execute();
- tSimpleLockingTest.delete().execute();
- tSimpleLockingTest.insert(1, null, null);
- }
-
- protected void createLockingOnMixedDataSet() throws Exception {
- tLockingHelper.delete().execute();
- tRelLockingTest.delete().execute();
- tSimpleLockingTest.delete().execute();
- tSimpleLockingTest.insert(1, null, null);
- tSimpleLockingTest.insert(2, "LockTest2", null);
- tSimpleLockingTest.insert(3, "LockTest3", "Another Lock Test");
- }
-
- protected void createLockingOnToOneDataSet() throws Exception {
- tLockingHelper.delete().execute();
- tRelLockingTest.delete().execute();
- tSimpleLockingTest.delete().execute();
- tSimpleLockingTest.insert(1, "LockTest1", null);
- tRelLockingTest.insert(5, 1, "Rel Test 1");
- tLockingHelper.insert(1, 5, "Locking Helper 1");
- }
-
- protected void createSimpleLockUpdate() throws Exception {
- assertEquals(1, tSimpleLockingTest
- .update()
- .set("NAME", "LockTest1Updated")
- .where("LOCKING_TEST_ID", 1)
- .execute());
- }
-
- protected void createRelLockUpdate() throws Exception {
- tRelLockingTest.update().set("SIMPLE_LOCKING_TEST_ID", 1).where(
- "REL_LOCKING_TEST_ID",
- 5).execute();
- }
-
- protected void createSimpleLockDelete() throws Exception {
- tSimpleLockingTest.delete().execute();
- }
-
- public void testSuccessSimpleLockingOnDelete() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- context.deleteObjects(object);
- context.commitChanges();
- }
-
- public void testSuccessSimpleLockingOnDeleteFollowedByInvalidate() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- context.deleteObjects(object);
- context.invalidateObjects(object);
- context.commitChanges();
- }
-
- public void testSuccessSimpleLockingOnDeleteFollowedByForgetSnapshot()
- throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- context.deleteObjects(object);
- context.getObjectStore().getDataRowCache().forgetSnapshot(object.getObjectId());
- context.commitChanges();
- }
-
- public void testSuccessSimpleLockingOnDeletePrecededByInvalidate() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- context.invalidateObjects(object);
- context.deleteObjects(object);
- context.commitChanges();
- }
-
- public void testSuccessSimpleLockingOnDeletePrecededByForgetSnapshot()
- throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- context.getObjectStore().getDataRowCache().forgetSnapshot(object.getObjectId());
- context.deleteObjects(object);
- context.commitChanges();
- }
-
- public void testFailSimpleLockingOnDelete() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("second update");
- context.commitChanges();
-
- // change row underneath, delete and save... optimistic lock failure expected
- createSimpleLockUpdate();
-
- context.deleteObjects(object);
-
- try {
- context.commitChanges();
- fail("Optimistic lock failure expected.");
- }
- catch (OptimisticLockException ex) {
- // optimistic lock failure expected...
- }
- }
-
- public void testSuccessSimpleLockingOnUpdate() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- object.setDescription("second update");
-
- context.commitChanges();
- }
-
- public void testSuccessSimpleLockingOnUpdateFollowedByInvalidate() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- object.setDescription("second update");
- context.invalidateObjects(object);
-
- context.commitChanges();
- }
-
- public void testSuccessSimpleLockingOnUpdatePrecededByInvalidate() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- context.invalidateObjects(object);
- object.setDescription("second update");
-
- context.commitChanges();
- }
-
- public void testSuccessSimpleLockingOnUpdateFollowedByForgetSnapshot()
- throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- object.setDescription("second update");
- context.getObjectStore().getDataRowCache().forgetSnapshot(object.getObjectId());
-
- context.commitChanges();
- }
-
- public void testSuccessSimpleLockingOnUpdatePrecededByForgetSnapshot()
- throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- context.getObjectStore().getDataRowCache().forgetSnapshot(object.getObjectId());
- object.setDescription("second update");
-
- context.commitChanges();
- }
-
- public void testFailSimpleLocking() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected
- object.setDescription("first update");
- context.commitChanges();
-
- // change row underneath, change description and save... optimistic lock failure
- // expected
- createSimpleLockUpdate();
-
- object.setDescription("second update");
-
- try {
- context.commitChanges();
- fail("Optimistic lock failure expected.");
- }
- catch (OptimisticLockException ex) {
- // optimistic lock failure expected...
- }
- }
-
- public void testFailLockingOnNull() throws Exception {
- createLockingOnNullDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- // change description and save... no optimistic lock failure expected...
- object.setDescription("first update");
- context.commitChanges();
-
- // change row underneath, change description and save... optimistic lock failure
- // expected
- createSimpleLockUpdate();
-
- object.setDescription("second update");
-
- try {
- context.commitChanges();
- fail("Optimistic lock failure expected.");
- }
- catch (OptimisticLockException ex) {
- // optimistic lock failure expected...
- assertEquals(object.getObjectId(), ex.getFailedObjectId());
- }
- }
-
- public void testSuccessLockingOnMixed() throws Exception {
- createLockingOnMixedDataSet();
-
- SelectQuery query = new SelectQuery(SimpleLockingTestEntity.class);
- query.addOrdering(new Ordering("db:LOCKING_TEST_ID", SortOrder.ASCENDING));
-
- List<?> allObjects = context.performQuery(query);
- assertEquals(3, allObjects.size());
-
- SimpleLockingTestEntity object1 = (SimpleLockingTestEntity) allObjects.get(0);
- SimpleLockingTestEntity object2 = (SimpleLockingTestEntity) allObjects.get(1);
- SimpleLockingTestEntity object3 = (SimpleLockingTestEntity) allObjects.get(2);
-
- // change description and save... no optimistic lock failure expected...
- object1.setDescription("first update for object1");
- object2.setDescription("first update for object2");
- object3.setName("object3 - new name");
- context.commitChanges();
-
- // TODO: it would be nice to pick inside DataContext to see that 3 batches where
- // generated...
- // this requires refactoring of ContextCommit.
- }
-
- public void testFailLockingOnToOne() throws Exception {
- createLockingOnToOneDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- RelLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- RelLockingTestEntity object = (RelLockingTestEntity) allObjects.get(0);
-
- // change name and save... no optimistic lock failure expected
- object.setName("first update");
- context.commitChanges();
-
- // change relationship and save... no optimistic lock failure expected
- SimpleLockingTestEntity object1 = context
- .newObject(SimpleLockingTestEntity.class);
- object.setToSimpleLockingTest(object1);
- context.commitChanges();
-
- // change row underneath, change description and save... optimistic lock failure
- // expected
- createRelLockUpdate();
-
- object.setName("third update");
-
- try {
- context.commitChanges();
- fail("Optimistic lock failure expected.");
- }
- catch (OptimisticLockException ex) {
- // optimistic lock failure expected...
- }
- }
-
- public void testFailRetrieveRow() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
- object.setDescription("first update");
-
- // change row underneath, change description and save... optimistic lock failure
- // expected
- createSimpleLockUpdate();
-
- try {
- context.commitChanges();
- fail("Optimistic lock failure expected.");
- }
- catch (OptimisticLockException ex) {
- Map<?, ?> freshFailedRow = ex.getFreshSnapshot(context);
- assertNotNull(freshFailedRow);
- assertEquals("LockTest1Updated", freshFailedRow.get("NAME"));
- }
- }
-
- public void testFailRetrieveDeletedRow() throws Exception {
- createSimpleLockingDataSet();
-
- List<?> allObjects = context.performQuery(new SelectQuery(
- SimpleLockingTestEntity.class));
- assertEquals(1, allObjects.size());
-
- SimpleLockingTestEntity object = (SimpleLockingTestEntity) allObjects.get(0);
-
- object.setDescription("first update");
-
- // delete row underneath, change description and save... optimistic lock failure
- // expected
- createSimpleLockDelete();
-
- try {
- context.commitChanges();
- fail("Optimistic lock failure expected.");
- }
- catch (OptimisticLockException ex) {
- Map<?, ?> freshFailedRow = ex.getFreshSnapshot(context);
- assertNull("" + freshFailedRow, freshFailedRow);
- }
- }
-}