Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaspar De Groot2011-09-19 05:40:08 +0000
committerCaspar De Groot2011-09-19 05:40:08 +0000
commitede599acbecf7b5aaa3c5e5e581ba91811e685ca (patch)
tree65f834bfb3abd4726e2964207dd7af2f962b7d17 /plugins/org.eclipse.emf.cdo.tests/src/org
parent98f83cd84af008140603c042ef337ad6c9c2e97f (diff)
downloadcdo-ede599acbecf7b5aaa3c5e5e581ba91811e685ca.tar.gz
cdo-ede599acbecf7b5aaa3c5e5e581ba91811e685ca.tar.xz
cdo-ede599acbecf7b5aaa3c5e5e581ba91811e685ca.zip
[356754] Raw replication of persistent locks
https://bugs.eclipse.org/bugs/show_bug.cgi?id=356754
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.tests/src/org')
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java8
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java9
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockRawReplicationTest.java23
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockReplicationTest.java169
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java111
6 files changed, 206 insertions, 118 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java
index a4d9fca16e..d2b6d9202a 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java
@@ -245,4 +245,12 @@ public abstract class AbstractSyncingTest extends AbstractCDOTest
ConcurrencyUtil.sleep(SLEEP_MILLIS);
}
}
+
+ protected static CDOTransaction openTransaction(CDOSession session)
+ {
+ CDOTransaction tx = session.openTransaction();
+ tx.options().setLockNotificationEnabled(true);
+ tx.enableDurableLocking(true);
+ return tx;
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java
index cd92e90e75..7ad9814aa6 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java
@@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.tests.config.IScenario;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest;
import org.eclipse.emf.cdo.tests.offline.FailoverTest;
import org.eclipse.emf.cdo.tests.offline.OfflineDelayed2Test;
+import org.eclipse.emf.cdo.tests.offline.OfflineLockReplicationTest;
import org.eclipse.emf.cdo.tests.offline.OfflineLockingTest;
import org.eclipse.emf.cdo.tests.offline.OfflineTest;
@@ -41,12 +42,14 @@ public class AllTestsMEMOffline extends AllConfigs
@Override
protected void initTestClasses(List<Class<? extends ConfigTest>> testClasses, IScenario scenario)
{
- // MEM does not support raw replication
- // testClasses.add(OfflineRawTest.class);
-
testClasses.add(OfflineLockingTest.class);
+ testClasses.add(OfflineLockReplicationTest.class);
testClasses.add(OfflineTest.class);
testClasses.add(OfflineDelayed2Test.class);
testClasses.add(FailoverTest.class);
+
+ // MEM does not support raw replication
+ // testClasses.add(OfflineRawTest.class);
+ // testClasses.add(OfflineLockRawReplicationTest.class);
}
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java
index b6cc6f9585..0764a1ad1e 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java
@@ -117,10 +117,6 @@ public class OfflineDelayedTest extends AbstractSyncingTest
waitForOnline(clone);
}
- // public void testXXX() throws Exception
- // {
- // }
-
public void _testSyncWhileCommittingToMaster_NewPackage() throws Exception
{
TestListener listener = new TestListener();
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockRawReplicationTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockRawReplicationTest.java
new file mode 100644
index 0000000000..229fcf4b53
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockRawReplicationTest.java
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Caspar De Groot - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.offline;
+
+/**
+ * @author Caspar De Groot
+ */
+public class OfflineLockRawReplicationTest extends OfflineLockReplicationTest
+{
+ @Override
+ protected boolean isRawReplication()
+ {
+ return true;
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockReplicationTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockReplicationTest.java
new file mode 100644
index 0000000000..9af878a8a7
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockReplicationTest.java
@@ -0,0 +1,169 @@
+/**
+ * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Caspar De Groot - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.offline;
+
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.internal.server.syncing.OfflineClone;
+import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.spi.server.InternalRepository;
+import org.eclipse.emf.cdo.tests.AbstractSyncingTest;
+import org.eclipse.emf.cdo.tests.model1.Company;
+import org.eclipse.emf.cdo.tests.util.TestListener2;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.util.CDOUtil;
+import org.eclipse.emf.cdo.util.CommitException;
+import org.eclipse.emf.cdo.view.CDOViewLocksChangedEvent;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * @author Caspar De Groot
+ */
+public class OfflineLockReplicationTest extends AbstractSyncingTest
+{
+ public void testCloneLocks_replicationToOtherClone_newSession() throws CommitException
+ {
+ testCloneLocks_replicationToOtherClone(false);
+ }
+
+ public void testCloneLocks_replicationToOtherClone_sameSession() throws CommitException
+ {
+ testCloneLocks_replicationToOtherClone(true);
+ }
+
+ private void testCloneLocks_replicationToOtherClone(boolean keepSession) throws CommitException
+ {
+ InternalRepository repo1 = getRepository("repo1");
+ assertEquals(true, repo1 instanceof OfflineClone);
+ InternalRepository repo2 = getRepository("repo2");
+ assertEquals(true, repo2 instanceof OfflineClone);
+
+ OfflineClone clone2 = (OfflineClone)repo2;
+
+ waitForOnline(getRepository("repo1"));
+ waitForOnline(getRepository("repo2"));
+
+ CDOSession clone1session = openSession("repo1");
+
+ // Store 3 objects in repo1
+ CDOTransaction tx1_sess1 = openTransaction(clone1session);
+ CDOResource resource_tx1_sess1 = tx1_sess1.createResource(getResourcePath("test"));
+ Company companyA = getModel1Factory().createCompany();
+ Company companyB = getModel1Factory().createCompany();
+ Company companyC = getModel1Factory().createCompany();
+ resource_tx1_sess1.getContents().add(companyA);
+ resource_tx1_sess1.getContents().add(companyB);
+ resource_tx1_sess1.getContents().add(companyC);
+ tx1_sess1.commit();
+
+ CDOTransaction tx1_sess2;
+ {
+ // Verify that they're visible in repo2
+ tx1_sess2 = openTransactionWithLockListener("repo2");
+ CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test"));
+ assertEquals(3, resource_tx1_sess2.getContents().size());
+
+ if (!keepSession)
+ {
+ tx1_sess2.getSession().close();
+ tx1_sess2 = null;
+ }
+ }
+
+ clone2.goOffline();
+ waitForOffline(clone2);
+
+ // Lock the objects in repo1. Since repo1 is ONLINE, this will also lock them
+ // in the master.
+ CDOUtil.getCDOObject(companyA).cdoReadLock().lock();
+ CDOUtil.getCDOObject(companyB).cdoWriteLock().lock();
+ CDOUtil.getCDOObject(companyC).cdoWriteOption().lock();
+
+ clone2.goOnline();
+ waitForOnline(clone2);
+
+ {
+ // Verify that the locks are visible in repo2
+ if (!keepSession)
+ {
+ tx1_sess2 = openTransactionWithLockListener("repo2");
+ }
+ else
+ {
+ ((TestListener2)tx1_sess2.getListeners()[0]).waitFor(1);
+ }
+
+ CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test"));
+ EList<EObject> contents = resource_tx1_sess2.getContents();
+ CDOObject companyA_in_sess2 = CDOUtil.getCDOObject(contents.get(0));
+ CDOObject companyB_in_sess2 = CDOUtil.getCDOObject(contents.get(1));
+ CDOObject companyC_in_sess2 = CDOUtil.getCDOObject(contents.get(2));
+
+ assertEquals(true, companyA_in_sess2.cdoReadLock().isLockedByOthers());
+ assertEquals(true, companyB_in_sess2.cdoWriteLock().isLockedByOthers());
+ assertEquals(true, companyC_in_sess2.cdoWriteOption().isLockedByOthers());
+
+ if (!keepSession)
+ {
+ tx1_sess2.getSession().close();
+ tx1_sess2 = null;
+ }
+ }
+
+ clone2.goOffline();
+ waitForOffline(clone2);
+
+ // Unlock the objects in repo1. Since repo1 is ONLINE, this will also lock them
+ // in the master.
+ CDOUtil.getCDOObject(companyA).cdoReadLock().unlock();
+ CDOUtil.getCDOObject(companyB).cdoWriteLock().unlock();
+ CDOUtil.getCDOObject(companyC).cdoWriteOption().unlock();
+
+ clone2.goOnline();
+ waitForOnline(clone2);
+
+ {
+ // Verify in repo2
+ if (!keepSession)
+ {
+ tx1_sess2 = openTransactionWithLockListener("repo2");
+ }
+ else
+ {
+ ((TestListener2)tx1_sess2.getListeners()[0]).waitFor(2);
+ }
+
+ CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test"));
+ EList<EObject> contents = resource_tx1_sess2.getContents();
+ CDOObject companyA_in_sess2 = CDOUtil.getCDOObject(contents.get(0));
+ CDOObject companyB_in_sess2 = CDOUtil.getCDOObject(contents.get(1));
+ CDOObject companyC_in_sess2 = CDOUtil.getCDOObject(contents.get(2));
+
+ assertEquals(false, companyA_in_sess2.cdoReadLock().isLockedByOthers());
+ assertEquals(false, companyB_in_sess2.cdoWriteLock().isLockedByOthers());
+ assertEquals(false, companyC_in_sess2.cdoWriteOption().isLockedByOthers());
+
+ tx1_sess2.getSession().close();
+ }
+
+ clone1session.close();
+ }
+
+ private CDOTransaction openTransactionWithLockListener(String repoName)
+ {
+ CDOSession session = openSession(repoName);
+ CDOTransaction tx = openTransaction(session);
+ tx.addListener(new TestListener2(CDOViewLocksChangedEvent.class));
+ return tx;
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java
index 95312e7aaa..9ef3f09941 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java
@@ -17,21 +17,16 @@ import org.eclipse.emf.cdo.internal.server.syncing.OfflineClone;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.session.CDOSessionInvalidationEvent;
import org.eclipse.emf.cdo.session.CDOSessionLocksChangedEvent;
-import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.emf.cdo.tests.AbstractSyncingTest;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.util.TestListener2;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
-import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.view.CDOViewLocksChangedEvent;
import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
/**
* @author Caspar De Groot
*/
@@ -194,110 +189,4 @@ public class OfflineLockingTest extends AbstractSyncingTest
clone1Session.close();
clone2Session.close();
}
-
- public void testCloneLocks_replicationToOtherClone() throws CommitException
- {
- InternalRepository repo1 = getRepository("repo1");
- assertEquals(true, repo1 instanceof OfflineClone);
- InternalRepository repo2 = getRepository("repo2");
- assertEquals(true, repo2 instanceof OfflineClone);
-
- OfflineClone clone2 = (OfflineClone)repo2;
-
- waitForOnline(getRepository("repo1"));
- waitForOnline(getRepository("repo2"));
-
- CDOSession clone1session = openSession("repo1");
-
- // Store 3 objects in repo1
- CDOTransaction tx1_sess1 = openTransaction(clone1session);
- CDOResource resource_tx1_sess1 = tx1_sess1.createResource(getResourcePath("test"));
- Company companyA = getModel1Factory().createCompany();
- Company companyB = getModel1Factory().createCompany();
- Company companyC = getModel1Factory().createCompany();
- resource_tx1_sess1.getContents().add(companyA);
- resource_tx1_sess1.getContents().add(companyB);
- resource_tx1_sess1.getContents().add(companyC);
- tx1_sess1.commit();
-
- {
- // Verify that they're visible in repo2
- CDOSession clone2session = openSession("repo2");
- CDOTransaction tx1_sess2 = openTransaction(clone2session);
- CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test"));
- assertEquals(3, resource_tx1_sess2.getContents().size());
- tx1_sess2.close();
- clone2session.close();
- }
-
- clone2.goOffline();
- waitForOffline(clone2);
-
- // Lock the objects in repo1. Since repo1 is ONLINE, this will also lock them
- // in the master.
- CDOUtil.getCDOObject(companyA).cdoReadLock().lock();
- CDOUtil.getCDOObject(companyB).cdoWriteLock().lock();
- CDOUtil.getCDOObject(companyC).cdoWriteOption().lock();
-
- clone2.goOnline();
- waitForOnline(clone2);
-
- {
- // Verify that the locks are visible in repo2
- CDOSession clone2session = openSession("repo2");
- CDOTransaction tx1_sess2 = openTransaction(clone2session);
- CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test"));
- EList<EObject> contents = resource_tx1_sess2.getContents();
- CDOObject companyA_in_sess2 = CDOUtil.getCDOObject(contents.get(0));
- CDOObject companyB_in_sess2 = CDOUtil.getCDOObject(contents.get(1));
- CDOObject companyC_in_sess2 = CDOUtil.getCDOObject(contents.get(2));
-
- assertEquals(true, companyA_in_sess2.cdoReadLock().isLockedByOthers());
- assertEquals(true, companyB_in_sess2.cdoWriteLock().isLockedByOthers());
- assertEquals(true, companyC_in_sess2.cdoWriteOption().isLockedByOthers());
-
- tx1_sess2.close();
- clone2session.close();
- }
-
- clone2.goOffline();
- waitForOffline(clone2);
-
- // Unlock the objects in repo1. Since repo1 is ONLINE, this will also lock them
- // in the master.
- CDOUtil.getCDOObject(companyA).cdoReadLock().unlock();
- CDOUtil.getCDOObject(companyB).cdoWriteLock().unlock();
- CDOUtil.getCDOObject(companyC).cdoWriteOption().unlock();
-
- clone2.goOnline();
- waitForOnline(clone2);
-
- {
- // Verify in repo2
- CDOSession clone2session = openSession("repo2");
- CDOTransaction tx1_sess2 = openTransaction(clone2session);
- CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test"));
- EList<EObject> contents = resource_tx1_sess2.getContents();
- CDOObject companyA_in_sess2 = CDOUtil.getCDOObject(contents.get(0));
- CDOObject companyB_in_sess2 = CDOUtil.getCDOObject(contents.get(1));
- CDOObject companyC_in_sess2 = CDOUtil.getCDOObject(contents.get(2));
-
- assertEquals(false, companyA_in_sess2.cdoReadLock().isLockedByOthers());
- assertEquals(false, companyB_in_sess2.cdoWriteLock().isLockedByOthers());
- assertEquals(false, companyC_in_sess2.cdoWriteOption().isLockedByOthers());
-
- tx1_sess2.close();
- clone2session.close();
- }
-
- clone1session.close();
- }
-
- private static CDOTransaction openTransaction(CDOSession session)
- {
- CDOTransaction tx = session.openTransaction();
- tx.options().setLockNotificationEnabled(true);
- tx.enableDurableLocking(true);
- return tx;
- }
}

Back to the top