diff options
author | Caspar De Groot | 2011-07-22 06:49:40 +0000 |
---|---|---|
committer | Caspar De Groot | 2011-07-22 06:49:40 +0000 |
commit | 1036f1d4827c74af0863403cf35f482f201676b7 (patch) | |
tree | edcb855ae7f3c9a461308a178e0619e77d27239c /plugins/org.eclipse.emf.cdo.tests | |
parent | c25c1dd4e3ec84079ff08955b113e03a97f94ab0 (diff) | |
download | cdo-1036f1d4827c74af0863403cf35f482f201676b7.tar.gz cdo-1036f1d4827c74af0863403cf35f482f201676b7.tar.xz cdo-1036f1d4827c74af0863403cf35f482f201676b7.zip |
[351793] Enhance LockMgr with write options
https://bugs.eclipse.org/bugs/show_bug.cgi?id=351793
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.tests')
3 files changed, 117 insertions, 4 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractLockingTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractLockingTest.java index 71afcc5006..5774dc971c 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractLockingTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractLockingTest.java @@ -46,6 +46,18 @@ public class AbstractLockingTest extends AbstractCDOTest cdoObject.cdoWriteLock().unlock(); } + protected static void writeOption(EObject object) throws InterruptedException + { + CDOObject cdoObject = CDOUtil.getCDOObject(object); + assertEquals(true, cdoObject.cdoWriteOption().tryLock(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS)); + } + + protected static void writeUnoption(EObject object) throws InterruptedException + { + CDOObject cdoObject = CDOUtil.getCDOObject(object); + cdoObject.cdoWriteOption().unlock(); + } + protected static void assertReadLock(boolean expected, EObject object) { CDOObject cdoObject = CDOUtil.getCDOObject(object); @@ -57,4 +69,10 @@ public class AbstractLockingTest extends AbstractCDOTest CDOObject cdoObject = CDOUtil.getCDOObject(object); assertEquals(expected, cdoObject.cdoWriteLock().isLocked()); } + + protected static void assertWriteOption(boolean expected, EObject object) + { + CDOObject cdoObject = CDOUtil.getCDOObject(object); + assertEquals(expected, cdoObject.cdoWriteOption().isLocked()); + } } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerRestartTransactionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerRestartTransactionTest.java index 9445833dbb..15c7839f05 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerRestartTransactionTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerRestartTransactionTest.java @@ -247,6 +247,36 @@ public class LockingManagerRestartTransactionTest extends AbstractLockingTest assertWriteLock(true, company); } + public void testWriteOptionAfterEnable() throws Exception + { + Company company = getModel1Factory().createCompany(); + resource.getContents().add(company); + transaction.commit(); + + String durableLockingID = transaction.enableDurableLocking(true); + writeOption(company); + + restart(durableLockingID); + + company = (Company)resource.getContents().get(0); + assertWriteOption(true, company); + } + + public void testWriteOptionBeforeEnable() throws Exception + { + Company company = getModel1Factory().createCompany(); + resource.getContents().add(company); + transaction.commit(); + + writeOption(company); + String durableLockingID = transaction.enableDurableLocking(true); + + restart(durableLockingID); + + company = (Company)resource.getContents().get(0); + assertWriteOption(true, company); + } + public void testLockUpgradeAfterEnable() throws Exception { Company company = getModel1Factory().createCompany(); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java index df21458955..dca6418eac 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java @@ -8,6 +8,7 @@ * Contributors: * Simon McDuff - initial API and implementation * Eike Stepper - maintenance + * Caspar De Groot - write options */ package org.eclipse.emf.cdo.tests; @@ -25,7 +26,7 @@ import org.eclipse.emf.cdo.util.LockTimeoutException; import org.eclipse.emf.cdo.util.StaleRevisionLockException; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; -import org.eclipse.net4j.util.concurrent.RWLockManager; +import org.eclipse.net4j.util.concurrent.RWOLockManager; import org.eclipse.net4j.util.io.IOUtil; import java.util.Collections; @@ -40,9 +41,73 @@ import java.util.concurrent.TimeUnit; */ public class LockingManagerTest extends AbstractLockingTest { + public void testWriteOptions() throws Exception + { + final RWOLockManager<Integer, Integer> lockingManager = new RWOLockManager<Integer, Integer>(); + + Set<Integer> keys = new HashSet<Integer>(); + keys.add(1); + lockingManager.lock(LockType.OPTION, 1, keys, 1000); + + // (R=Read, W=Write, WO=WriteOption) + // Scenario 1: 1 has WO, 2 requests W -> fail + keys.clear(); + keys.add(1); + + try + { + lockingManager.lock(LockType.WRITE, 2, keys, 1000); // Must fail + fail("Should have thrown an exception"); + } + catch (Exception e) + { + } + + // Scenario 2: 1 has WO, 2 requests R -> succeed + try + { + lockingManager.lock(LockType.READ, 2, keys, 1000); // Must succeed + } + catch (Exception e) + { + fail("Should not have thrown an exception"); + } + + // Scenario 3: 1 has WO, 2 has R, 1 requests W -> fail + try + { + lockingManager.lock(LockType.WRITE, 1, keys, 1000); // Must fail + fail("Should have thrown an exception"); + } + catch (Exception e) + { + } + + // Scenario 4: 1 has WO, 2 has R, 2 requests WO -> fail + try + { + lockingManager.lock(LockType.OPTION, 2, keys, 1000); // Must fail + fail("Should have thrown an exception"); + } + catch (Exception e) + { + } + + // Scenario 5: 1 has WO, 2 has nothing, 2 requests WO -> fail + lockingManager.unlock(LockType.READ, 2, keys); + try + { + lockingManager.lock(LockType.OPTION, 2, keys, 1000); // Must fail + fail("Should have thrown an exception"); + } + catch (Exception e) + { + } + } + public void testBasicUpgradeFromReadToWriteLock() throws Exception { - final RWLockManager<Integer, Integer> lockingManager = new RWLockManager<Integer, Integer>(); + final RWOLockManager<Integer, Integer> lockingManager = new RWOLockManager<Integer, Integer>(); Runnable step1 = new Runnable() { @@ -127,7 +192,7 @@ public class LockingManagerTest extends AbstractLockingTest public void testBasicWrongUnlock() throws Exception { - final RWLockManager<Integer, Integer> lockingManager = new RWLockManager<Integer, Integer>(); + final RWOLockManager<Integer, Integer> lockingManager = new RWOLockManager<Integer, Integer>(); Set<Integer> keys = new HashSet<Integer>(); keys.add(1); lockingManager.lock(LockType.READ, 1, keys, 10000); @@ -163,7 +228,7 @@ public class LockingManagerTest extends AbstractLockingTest start = System.currentTimeMillis(); assertEquals(false, CDOUtil.getCDOObject(company2).cdoWriteLock().tryLock(2, TimeUnit.SECONDS)); - assertEquals(true, System.currentTimeMillis() - start > 2000); + assertEquals(true, System.currentTimeMillis() - start >= 2000); } public void testReadLockByOthers() throws Exception |