Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaspar De Groot2011-07-22 06:49:40 +0000
committerCaspar De Groot2011-07-22 06:49:40 +0000
commit1036f1d4827c74af0863403cf35f482f201676b7 (patch)
treeedcb855ae7f3c9a461308a178e0619e77d27239c /plugins/org.eclipse.emf.cdo.tests
parentc25c1dd4e3ec84079ff08955b113e03a97f94ab0 (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractLockingTest.java18
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerRestartTransactionTest.java30
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/LockingManagerTest.java73
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

Back to the top