/* | |
* 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; | |
} | |
} |