blob: d2a725c657ef272055233f607e47eec7e34dd44a [file] [log] [blame]
/*
* TestOptimisticLockGroups.java
*
* Created on October 12, 2006, 2:57 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
/*
* 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.openjpa.persistence.kernel;
import org.apache.openjpa.persistence.kernel.common.apps.LockGroupPC;
import org.apache.openjpa.persistence.kernel.common.apps.LockGroupPC2;
import org.apache.openjpa.persistence.kernel.common.apps.RuntimeTest1;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
public class TestOptimisticLockGroups extends BaseKernelTest {
private Object oid;
/**
* Creates a new instance of TestOptimisticLockGroups
*/
public TestOptimisticLockGroups() {
}
public TestOptimisticLockGroups(String name) {
super(name);
}
public void setUp() {
deleteAll(LockGroupPC.class);
OpenJPAEntityManager pm = getPM(false, false);
startTx(pm);
Object o = new LockGroupPC();
pm.persist(o);
endTx(pm);
oid = pm.getObjectId(o);
endEm(pm);
}
public void testDefaultLockGroupFailure1() {
OpenJPAEntityManager pm1 = getPM(false, false);
startTx(pm1);
LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class, oid);
pc1.setDefaultLockGroupStringField("pm1 value");
OpenJPAEntityManager pm2 = getPM(false, false);
startTx(pm2);
LockGroupPC pc2 = (LockGroupPC) pm2.find(LockGroupPC.class, oid);
pc2.setDefaultLockGroupStringField("pm2 value");
endTx(pm1);
endEm(pm1);
try {
endTx(pm2);
fail("should not be able to commit change to same value");
} catch (Exception e) {
assertEquals(pc2, getFailedObject(e));
}
endEm(pm2);
}
public void testDefaultLockGroupFailure2() {
OpenJPAEntityManager pm1 = getPM(false, false);
startTx(pm1);
LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class, oid);
pc1.setDefaultLockGroupStringField("pm1 value");
OpenJPAEntityManager pm2 = getPM(false, false);
startTx(pm2);
LockGroupPC pc2 = (LockGroupPC) pm2.find(LockGroupPC.class, oid);
pc2.setExplicitDefaultLockGroupIntField(2);
endTx(pm1);
endEm(pm1);
try {
endTx(pm2);
fail("should not be able to commit change to same value");
} catch (Exception e) {
assertEquals(pc2, getFailedObject(e));
}
endEm(pm2);
}
public void testNonDefaultLockGroupFailure1() {
OpenJPAEntityManager pm1 = getPM(false, false);
startTx(pm1);
LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class, oid);
pc1.setLockGroup0IntField(1);
OpenJPAEntityManager pm2 = getPM(false, false);
startTx(pm2);
LockGroupPC pc2 = (LockGroupPC) pm2.find(LockGroupPC.class, oid);
pc2.setLockGroup0IntField(2);
endTx(pm1);
endEm(pm1);
try {
endTx(pm2);
fail("should not be able to commit change to same value");
} catch (Exception e) {
assertEquals(pc2, getFailedObject(e));
}
endEm(pm2);
}
public void testNonDefaultLockGroupFailure2() {
OpenJPAEntityManager pm1 = getPM(false, false);
startTx(pm1);
LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class, oid);
pc1.setLockGroup0IntField(1);
OpenJPAEntityManager pm2 = getPM(false, false);
startTx(pm2);
LockGroupPC pc2 = (LockGroupPC) pm2.find(LockGroupPC.class, oid);
pc2.setLockGroup0StringField("pm2");
endTx(pm1);
endEm(pm1);
try {
endTx(pm2);
fail("should not be able to commit change to same value");
} catch (Exception e) {
assertEquals(pc2, getFailedObject(e));
}
endEm(pm2);
}
public void testMultipleLockGroupSuccess1() {
OpenJPAEntityManager pm1 = getPM(false, false);
startTx(pm1);
LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class, oid);
pc1.setDefaultLockGroupStringField("pm1 value");
pc1.setExplicitDefaultLockGroupIntField(1);
OpenJPAEntityManager pm2 = getPM(false, false);
startTx(pm2);
LockGroupPC pc2 = (LockGroupPC) pm2.find(LockGroupPC.class, oid);
pc2.setLockGroup0IntField(2);
OpenJPAEntityManager pm3 = getPM(false, false);
startTx(pm3);
LockGroupPC pc3 = (LockGroupPC) pm3.find(LockGroupPC.class, oid);
pc3.setLockGroup1RelationField(new RuntimeTest1());
endTx(pm1);
endEm(pm1);
endTx(pm2);
endEm(pm2);
endTx(pm3);
endEm(pm3);
}
public void testMultipleLockGroupSuccess2() {
OpenJPAEntityManager pm1 = getPM(false, false);
startTx(pm1);
LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class, oid);
pc1.setDefaultLockGroupStringField("pm1 value");
pc1.setLockGroup0IntField(1);
OpenJPAEntityManager pm2 = getPM(false, false);
startTx(pm2);
LockGroupPC pc2 = (LockGroupPC) pm2.find(LockGroupPC.class, oid);
pc2.setLockGroup1RelationField(new RuntimeTest1());
endTx(pm2);
endEm(pm2);
endTx(pm1);
endEm(pm1);
}
// FIX ME: aokeke - test is taking so much resource and causing subsequent test to fail
// public void testNoLockGroupSuccess() {
// OpenJPAEntityManager pm1 = getPM(false, false);
// startTx(pm1,());
// LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class,oid);
// pc1.setDefaultLockGroupStringField("pm1 value");
// pc1.setLockGroup0IntField(1);
// pc1.setUnlockedStringField("pm1 value");
//
// OpenJPAEntityManager pm2 = getPM(false, false);
// startTx(pm2,());
// LockGroupPC pc2 = (LockGroupPC) pm2.find(LockGroupPC.class,oid);
// pc2.setLockGroup1RelationField(new RuntimeTest1());
// pc2.setUnlockedStringField("pm2 value");
//
// endTx(pm1,());
// endEm(pm1);
//
// endTx(pm2,());
// endEm(pm2);
// }
public void testAttachDetachSuccess()
throws Exception {
OpenJPAEntityManager pm1 = getPM(false, false);
LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class, oid);
Object detached = pm1.detach(pc1);
startTx(pm1);
pc1.setLockGroup0IntField(1);
pc1.setUnlockedStringField("pm1 changed value");
endTx(pm1);
endEm(pm1);
/*
// won't work without non-transient detached state
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ObjectOutputStream oos = new ObjectOutputStream (baos);
oos.writeObject (detached);
oos.close ();
baos.close ();
ByteArrayInputStream bais =
new ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = new ObjectInputStream (bais);
LockGroupPC clone = (LockGroupPC) ois.readObject ();
*/
LockGroupPC clone = (LockGroupPC) detached;
clone.setLockGroup1IntField(2);
clone.setUnlockedStringField("pm2 value");
OpenJPAEntityManager pm2 = getPM(false, false);
startTx(pm2);
pm2.merge(clone);
endTx(pm2);
endEm(pm2);
}
public void testAttachDetachFailure()
throws Exception {
OpenJPAEntityManager pm1 = getPM(false, false);
LockGroupPC pc1 = (LockGroupPC) pm1.find(LockGroupPC.class, oid);
Object detached = pm1.detach(pc1);
startTx(pm1);
pc1.setLockGroup0IntField(1);
endTx(pm1);
endEm(pm1);
/*
// won't work without non-transient detached state
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ObjectOutputStream oos = new ObjectOutputStream (baos);
oos.writeObject (detached);
oos.close ();
baos.close ();
ByteArrayInputStream bais =
new ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = new ObjectInputStream (bais);
LockGroupPC clone = (LockGroupPC) ois.readObject ();
*/
LockGroupPC clone = (LockGroupPC) detached;
clone.setLockGroup0IntField(2);
OpenJPAEntityManager pm2 = getPM(false, false);
startTx(pm2);
boolean failed = false;
try {
pm2.merge(clone);
} catch (Exception e) {
failed = true;
}
if (failed)
rollbackTx(pm2);
else {
try {
endTx(pm2);
fail("Allowed conflicting changes");
} catch (Exception jve) {
}
}
}
public void testLockGroupNone() {
OpenJPAEntityManager pm = getPM(false, false);
// pm.begin();
deleteAll(LockGroupPC2.class, pm);
startTx(pm);
LockGroupPC2 pc = new LockGroupPC2();
pc.setName("pc");
pm.persist(pc);
endTx(pm);
Object oid = pm.getObjectId(pc);
endEm(pm);
pm = getPM(false, false);
pc = (LockGroupPC2) pm.find(LockGroupPC2.class, oid);
startTx(pm);
pc.getList().add("foo");
OpenJPAEntityManager pm2 = getPM(false, false);
LockGroupPC2 pc2 = (LockGroupPC2) pm2.find(LockGroupPC2.class, oid);
startTx(pm2);
pc2.getList().add("bar");
endTx(pm2);
endEm(pm2);
endTx(pm);
endEm(pm);
pm = getPM(false, false);
pc = (LockGroupPC2) pm.find(LockGroupPC2.class, oid);
assertEquals(2, pc.getList().size());
endEm(pm);
}
// public void testKnownSubclass() {
// OpenJPAEntityManager pm = getPM(false, false);
// LockGroupPCKnownSubclass pc = new LockGroupPCKnownSubclass();
// pc.setDefaultLockGroupStringField("pc");
// startTx(pm,());
// pm.persist(pc);
// endTx(pm,());
//
// startTx(pm,());
// pc.setKnownSubclassStringField("foo");
// endTx(pm,());
// }
//FIXME jthomas - what do we need to substitute for JDOException ?
// private Object getFailedObject(JDOException e) {
// return ((JDOException) e.getNestedExceptions()[0]).getFailedObject();
// }
private Object getFailedObject(Exception e) {
return null;
}
}