From: <an...@us...> - 2009-09-08 19:05:00
|
Revision: 9850 http://wonder.svn.sourceforge.net/wonder/?rev=9850&view=rev Author: anjo Date: 2009-09-08 19:04:53 +0000 (Tue, 08 Sep 2009) Log Message: ----------- description, coalescing, checking thread state, constants Modified Paths: -------------- trunk/Wonder/Tests/ERXTest/Sources/er/erxtest/tests/ERXECLockingTestCase.java Modified: trunk/Wonder/Tests/ERXTest/Sources/er/erxtest/tests/ERXECLockingTestCase.java =================================================================== --- trunk/Wonder/Tests/ERXTest/Sources/er/erxtest/tests/ERXECLockingTestCase.java 2009-09-08 19:03:42 UTC (rev 9849) +++ trunk/Wonder/Tests/ERXTest/Sources/er/erxtest/tests/ERXECLockingTestCase.java 2009-09-08 19:04:53 UTC (rev 9850) @@ -2,12 +2,51 @@ import org.apache.log4j.Logger; +import er.extensions.appserver.ERXApplication; import er.extensions.eof.ERXEC; import junit.framework.TestCase; + +/* +This class should test locking of ECs: +- lock() when not locked in same thread +- lock() when locked in same thread +- lock() when saveChanges() delegate also locks + +- autolock() when not locked in same thread +- autolock() when locked in same thread + +- lock() when not locked in other thread +- lock() when locked in other thread + +- autolock() when not locked in other thread +- autolock() when locked in other thread + +- lock() when not autolocked in other thread +- lock() when autolocked in other thread + +- autolock() when not locked in other thread +- autolock() when locked in other thread + +- finalize() + +and all variations with coalesce() true/false +and all variations with shouldAutolock() true/false + +expected results are: +- all should have been locked() +- lock() context should not been autolocked() +- autolock() context should not been autolocked() if shouldAutolock() is false +- autolock() context should been autolocked() if shouldAutolock() is true +- autolock() context should not been called in finalize() + +- if coalesce, autolock should stay open? + + */ public class ERXECLockingTestCase extends TestCase { public static final Logger log = Logger.getLogger(ERXECLockingTestCase.class); + private static final long JOIN_TIME = 2000L; public static class EC extends ERXEC { public boolean beforeLock; @@ -21,6 +60,7 @@ public boolean afterAutoUnlock; public boolean wasAutolocked; + public int autoLocks; public long waitTime; @@ -41,6 +81,7 @@ boolean result = super.autoLock(method); if(result) { wasAutolocked = true; + autoLocks++; } afterAutoLock = true; return result; @@ -53,7 +94,7 @@ } public void saveChangesWithWait() { - waitTime = 1000L; + waitTime = 400; saveChanges(); } @@ -76,6 +117,18 @@ private EC createEC() { return new EC() ; } + + private void assertLockable(EC ec) { + assertTrue("Should be lockable", ec.tryLock()); + ec.unlock(); + } + + private void assertNotLockable(EC ec) { + if(ec.tryLock()) { + fail("Should be not lockable"); + } + ec.unlock(); + } public void test() { EC ec = createEC(); @@ -85,6 +138,7 @@ assertFalse(ec.beforeUnlock); assertFalse(ec.isAutoLocked()); assertFalse(ec.wasAutolocked); + assertLockable(ec); } public void testPlainOneThreadLocking() { @@ -104,8 +158,10 @@ assertFalse(ec.beforeAutoUnlock); assertFalse(ec.isAutoLocked()); assertFalse(ec.wasAutolocked); + assertEquals(ec.autoLocks, 0); + assertLockable(ec); } - + public void testPlainOneThreadAutoLocking() { EC ec = createEC(); ec.saveChanges(); @@ -119,8 +175,51 @@ assertTrue(ec.afterUnlock); assertFalse(ec.isAutoLocked()); assertTrue(ec.wasAutolocked); - } + assertTrue("autoLocks: " + ec.autoLocks, ec.autoLocks >= 1); + assertLockable(ec); + } + public void testPlainOneThreadAutoLockingCoalesceNotInRequest() { + // AK: not in a request->coalesce doesn't work + EC ec = createEC(); + ec.setCoalesceAutoLocks(true); + ec.saveChanges(); + ec.saveChanges(); + assertTrue(ec.beforeLock); + assertTrue(ec.afterLock); + assertTrue(ec.beforeAutoLock); + assertTrue(ec.afterAutoLock); + assertTrue(ec.beforeAutoUnlock); + assertTrue(ec.afterAutoUnlock); + assertTrue(ec.beforeUnlock); + assertTrue(ec.afterUnlock); + assertFalse(ec.isAutoLocked()); + assertTrue(ec.wasAutolocked); + assertEquals(2, ec.autoLocks); + assertLockable(ec); + } + + public void testPlainOneThreadAutoLockingCoalesceInRequest() { + EC ec = createEC(); + ERXApplication._startRequest(); + ec.setCoalesceAutoLocks(true); + ec.saveChanges(); + ec.saveChanges(); + ERXApplication._endRequest(); + assertTrue(ec.beforeLock); + assertTrue(ec.afterLock); + assertTrue(ec.beforeAutoLock); + assertTrue(ec.afterAutoLock); + assertTrue(ec.beforeAutoUnlock); + assertTrue(ec.afterAutoUnlock); + assertTrue(ec.beforeUnlock); + assertTrue(ec.afterUnlock); + assertEquals(1, ec.autoLocks); + assertFalse(ec.isAutoLocked()); + assertTrue(ec.wasAutolocked); + assertLockable(ec); + } + public void testPlainOneThreadAutoLockingWithLock() { EC ec = createEC(); ec.lock(); @@ -157,8 +256,10 @@ t1.start(); t2.start(); try { - t1.join(); - t2.join(); + t1.join(JOIN_TIME); + t2.join(JOIN_TIME); + assertFalse(t1.isAlive()); + assertFalse(t2.isAlive()); } catch (InterruptedException e) { assertTrue(false); } @@ -194,8 +295,10 @@ t1.start(); t2.start(); try { - t1.join(); - t2.join(); + t1.join(JOIN_TIME); + t2.join(JOIN_TIME); + assertFalse(t1.isAlive()); + assertFalse(t2.isAlive()); } catch (InterruptedException e) { assertTrue(false); } @@ -210,4 +313,104 @@ assertFalse(ec.isAutoLocked()); assertFalse(ec.wasAutolocked); } + + public void testTwoThreadWithLockAutoLock() { + final EC ec = createEC(); + + Runnable r1 = new Runnable() { + + public void run() { + log.info("Before save: " + Thread.currentThread().getName()); + ec.saveChangesWithWait(); + log.info("Saved: " + Thread.currentThread().getName()); + assertFalse(ec.isAutoLocked()); + } + + }; + Runnable r2 = new Runnable() { + + public void run() { + log.info("Before lock: " + Thread.currentThread().getName()); + ec.lock(); + log.info("After lock: " + Thread.currentThread().getName()); + ec.saveChangesWithWait(); + log.info("Saved: " + Thread.currentThread().getName()); + ec.unlock(); + assertFalse(ec.isAutoLocked()); + } + + }; + Thread t1 = new Thread(r1); + Thread t2 = new Thread(r2); + t1.start(); + t2.start(); + try { + t1.join(JOIN_TIME); + t2.join(JOIN_TIME); + assertFalse(t1.isAlive()); + assertFalse(t2.isAlive()); + } catch (InterruptedException e) { + assertTrue(false); + } + assertTrue(ec.beforeLock); + assertTrue(ec.afterLock); + assertTrue(ec.beforeAutoLock); + assertTrue(ec.afterAutoLock); + assertTrue(ec.beforeAutoUnlock); + assertTrue(ec.afterAutoUnlock); + assertTrue(ec.beforeUnlock); + assertTrue(ec.afterUnlock); + assertFalse(ec.isAutoLocked()); + assertTrue(ec.wasAutolocked); + } + + public void testTwoThreadWithAutoLockLock() { + final EC ec = createEC(); + + Runnable r2 = new Runnable() { + + public void run() { + log.info("Before save: " + Thread.currentThread().getName()); + ec.saveChangesWithWait(); + log.info("Saved: " + Thread.currentThread().getName()); + assertFalse(ec.isAutoLocked()); + } + + }; + Runnable r1 = new Runnable() { + + public void run() { + log.info("Before lock: " + Thread.currentThread().getName()); + ec.lock(); + log.info("After lock: " + Thread.currentThread().getName()); + ec.saveChangesWithWait(); + log.info("Saved: " + Thread.currentThread().getName()); + ec.unlock(); + assertFalse(ec.isAutoLocked()); + } + + }; + Thread t1 = new Thread(r1); + Thread t2 = new Thread(r2); + t1.start(); + t2.start(); + try { + t1.join(JOIN_TIME); + t2.join(JOIN_TIME); + assertFalse(t1.isAlive()); + assertFalse(t2.isAlive()); + } catch (InterruptedException e) { + assertTrue(false); + } + assertTrue(ec.beforeLock); + assertTrue(ec.afterLock); + assertTrue(ec.beforeAutoLock); + assertTrue(ec.afterAutoLock); + assertTrue(ec.beforeAutoUnlock); + assertTrue(ec.afterAutoUnlock); + assertTrue(ec.beforeUnlock); + assertTrue(ec.afterUnlock); + assertFalse(ec.isAutoLocked()); + assertTrue(ec.wasAutolocked); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |