package net.sourceforge.pain.db; import junit.framework.*; import net.sourceforge.pain.db.data.*; import java.io.*; /** * User: fmike Date: Aug 26, 2003 Time: 3:30:29 AM */ public final class TransactionTest extends TestCase { private PainDB db; public TransactionTest() { super("TransactionTest"); } protected void setUp() throws Exception { db = new PainDB(getName() + ".db"); db.ALLOW_PLAIN_WRITE = true; // allow work without transactions db.MANUAL_FLUSH_MODE = true; // commit will not flush (objects stays dirty) } protected void tearDown() throws Exception { if (db != null) { File file = new File(db.getDbFileName()); if (!db.isClosed()) { db.forceClose(); } db = null; file.delete(); } } public void testState1() throws Exception { AllFieldTypesObject obj = new AllFieldTypesObject(db); assertTrue(obj.isDirty()); // in plain write mode there is no NEW state assertEquals(false, obj.getBOOLEAN()); db.beginTransaction(); assertTrue(obj.isDirty()); obj.setBOOLEAN(true); assertTrue(obj.isDirty()); db.rollbackTransaction(); assertTrue(obj.isDirty()); assertEquals(false, obj.getBOOLEAN()); db.flush(); assertTrue(obj.isClean()); db.beginTransaction(); obj.setBOOLEAN(true); assertTrue(obj.isDirty()); db.commitTransaction(); assertTrue(obj.isDirty()); assertEquals(true, obj.getBOOLEAN()); db.flush(); assertTrue(obj.isClean()); db.beginTransaction(); obj.delete(); assertTrue(obj.isDeleted()); db.rollbackTransaction(); assertTrue(obj.isClean()); Object oid = obj.getOid(); db.beginTransaction(); obj.delete(); assertTrue(obj.isDeleted()); assertNull(db.getObject(oid)); db.commitTransaction(); assertTrue(obj.isDetached()); assertNull(db.getObject(oid)); db.flush(); assertTrue(obj.isDetached()); String fileName = db.getDbFileName(); db.close(); db = new PainDB(fileName); obj = (AllFieldTypesObject) db.getObject(oid); assertNull(obj); } public void testInverse1() throws Exception { AllFieldTypesObject obj1 = new AllFieldTypesObject(db); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); db.beginTransaction(); obj1.setREFERENCE(obj2); obj2.getREFERENCE_SET().add(obj1); db.commitTransaction(); assertSame(obj1.getREFERENCE(), obj2); assertTrue(obj2.getREFERENCE_SET().contains(obj1)); db.beginTransaction(); obj2.getREFERENCE_SET().remove(obj1); assertFalse(obj2.getREFERENCE_SET().contains(obj1)); db.rollbackTransaction(); assertTrue(obj2.getREFERENCE_SET().contains(obj1)); db.beginTransaction(); obj1.delete(); assertFalse(obj2.getREFERENCE_SET().contains(obj1)); db.rollbackTransaction(); assertTrue(obj2.getREFERENCE_SET().contains(obj1)); db.beginTransaction(); obj2.delete(); assertNull(obj1.getREFERENCE()); db.rollbackTransaction(); assertSame(obj1.getREFERENCE(), obj2); assertTrue(obj2.getREFERENCE_SET().contains(obj1)); } public void testReference1() throws IOException { AllFieldTypesObject obj1 = new AllFieldTypesObject(db); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); db.beginTransaction(); obj1.setREFERENCE(obj2); assertSame(obj1.getREFERENCE(), obj2); obj2.delete(); assertNull(obj1.getREFERENCE()); db.rollbackTransaction(); assertNull(obj1.getREFERENCE()); db.beginTransaction(); obj1.setREFERENCE(obj2); db.commitTransaction(); db.flush(); db.beginTransaction(); assertSame(obj1.getREFERENCE(), obj2); obj2.delete(); assertNull(obj1.getREFERENCE()); db.rollbackTransaction(); assertSame(obj1.getREFERENCE(), obj2); db.beginTransaction(); obj1.delete(); obj2.delete(); db.rollbackTransaction(); assertSame(obj1.getREFERENCE(), obj2); assertTrue(obj1.isClean()); // was flush } public void testCreate1() throws IOException { AllFieldTypesObject obj; db.beginTransaction(); obj = new AllFieldTypesObject(db); assertTrue(obj.isNew()); db.commitTransaction(); assertTrue(obj.isDirty()); db.flush(); assertTrue(obj.isClean()); } public void testDataIndexClean1() throws IOException { AllFieldTypesObject obj; db.beginTransaction(); obj = new AllFieldTypesObject(db); obj.getREFERENCE_SET().add(obj); db.commitTransaction(); db.beginTransaction(); obj.delete(); db.commitTransaction(); db.beginTransaction(); obj = new AllFieldTypesObject(db); assertTrue(obj.getREFERENCE_SET().isEmpty()); db.commitTransaction(); } public void testSavePoint1() throws IOException { db.beginTransaction(); AllFieldTypesObject obj = new AllFieldTypesObject(db); assertTrue(obj.isNew()); db.beginTransaction(); assertTrue(obj.isNew()); db.commitTransaction(); assertTrue(obj.isNew()); db.commitTransaction(); assertTrue(obj.isDirty()); db.flush(); assertTrue(obj.isClean()); obj.delete(); assertTrue(obj.isDetached()); } public void testSavePoint2() throws IOException { db.beginTransaction(); AllFieldTypesObject obj = new AllFieldTypesObject(db); assertTrue(obj.isNew()); obj.setINT(10); assertTrue(obj.isNew()); assertEquals(10, obj.getINT()); db.beginTransaction(); obj.setINT(20); assertEquals(20, obj.getINT()); obj.delete(); assertTrue(obj.isDeleted()); db.rollbackTransaction(); assertTrue(obj.isNew()); assertEquals(10, obj.getINT()); db.commitTransaction(); assertTrue(obj.isDirty()); obj.delete(); assertTrue(obj.isDetached()); } public void testSavePoint3() throws IOException { db.beginTransaction(); AllFieldTypesObject obj1 = new AllFieldTypesObject(db); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); obj1.setREFERENCE(obj2); assertSame(obj1.getREFERENCE(), obj2); db.beginTransaction(); obj1.setREFERENCE(null); db.rollbackTransaction(); assertSame(obj2, obj1.getREFERENCE()); assertTrue(obj2.isNew()); obj2.delete(); assertTrue(obj2.isDeleted()); db.commitTransaction(); assertTrue(obj2.isDetached()); assertNull(obj1.getREFERENCE()); } /** object created in internal transaction should save state after commitTN */ public void testSavePoint4() throws IOException { db.beginTransaction(); new AllFieldTypesObject(db); //class created db.beginTransaction(); AllFieldTypesObject obj2 = new AllFieldTypesObject(db); assertTrue(obj2.isNew()); db.commitTransaction(); assertTrue(obj2.isNew()); db.commitTransaction(); assertTrue(obj2.isDirty()); } public void testStringKeySetBUG1() throws IOException { db.beginTransaction(); AllFieldTypesObject obj = new AllFieldTypesObject(db); db.commitTransaction(); db.beginTransaction(); //1 obj.getSTRING_SET().add("ok"); db.beginTransaction(); //2 db.beginTransaction(); //3 obj.delete(); db.beginTransaction(); // 4 db.rollbackTransaction(); //4 db.rollbackTransaction(); //3 db.rollbackTransaction(); //2 db.rollbackTransaction(); //1 } public void testStringSetBackupRestoreBug1() throws IOException { db.beginTransaction(); AllFieldTypesObject obj = new AllFieldTypesObject(db); obj.getSTRING_SET().add("item"); assertEquals(1, obj.getSTRING_SET().size()); db.beginTransaction(); obj.setINT(10); db.rollbackTransaction(); assertEquals(1, obj.getSTRING_SET().size()); db.commitTransaction(); assertEquals(1, obj.getSTRING_SET().size()); } }