!7 cprint TestFileBasedLock { switchable File file; switchable double timeout = 10; transient FileBasedLock lock1, lock2; transient S contents; // contents for lock file start-thread { if (file == null) setField(file := javaxCachesDir("Lock Test/lockfile-" + aGlobalID())); print("Using file: " + file); contents = null; regularTest(); crashTest(); contents = "hello"; regularTest(); crashTest(); print("All OK!"); } FileBasedLock makeLock() { FileBasedLock lock = new(file); if (contents != null) lock.contentsForLockFile(contents); lock.verbose = true; lock.timeout = timeout; ret lock; } void regularTest() { afterwards { cleanMeUp(); } lock1 = makeLock(); lock2 = makeLock(); assertTrueVerbose("Locking lock1", lock1.tryToLock()); // Check lock file contents assertEquals(unnull(contents), loadTextFile(file)); assertFalseVerbose("Locking lock2", lock2.tryToLock()); print("Waiting for timeout (" + (timeout+1) + "s)"); sleepSeconds(timeout+1); assertFalseVerbose("Locking lock2", lock2.tryToLock()); close(lock1); assertTrueVerbose("Locking lock2", lock2.tryToLock()); close(lock2); print("\nRegular test OK!\n"); } void crashTest { afterwards { cleanMeUp(); } lock1 = makeLock(); lock2 = makeLock(); assertTrueVerbose("Locking lock1", lock1.tryToLock()); assertFalseVerbose("Locking lock2", lock2.tryToLock()); lock1._simulateCrash(); print("Waiting for timeout (" + (timeout+1) + "s)"); sleepSeconds(timeout+1); assertTrueVerbose("Locking lock2", lock2.tryToLock()); closeAll(lock1, lock2); print("\nCrash test OK!\n"); } void cleanMeUp { closeAll(lock1, lock2); } }