Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java')
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java181
1 files changed, 181 insertions, 0 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java
new file mode 100644
index 0000000000..2a93570d3d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_387563_Test.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2004 - 2012 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:
+ * Esteban Dugueperoux - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.bugzilla;
+
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode;
+import org.eclipse.emf.cdo.common.lock.CDOLockState;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.tests.AbstractCDOTest;
+import org.eclipse.emf.cdo.tests.model1.Category;
+import org.eclipse.emf.cdo.tests.model1.Company;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.util.CDOUtil;
+
+import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType;
+import org.eclipse.net4j.util.io.IOUtil;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Esteban Dugueperoux
+ */
+public class Bugzilla_387563_Test extends AbstractCDOTest
+{
+ private CDOTransaction transaction;
+
+ private Company company;
+
+ private Category category1;
+
+ private Category category2;
+
+ private Category category3;
+
+ private Category category4;
+
+ private Category category5;
+
+ @Override
+ protected void doSetUp() throws Exception
+ {
+ super.doSetUp();
+
+ CDOSession session = openSession();
+ session.options().setLockNotificationMode(LockNotificationMode.ALWAYS);
+
+ transaction = session.openTransaction();
+ // transaction.options().setAutoReleaseLocksEnabled(false);
+
+ CDOResource resource = transaction.createResource(getResourcePath("test1"));
+
+ category1 = getModel1Factory().createCategory();
+ category1.setName("category1");
+
+ category2 = getModel1Factory().createCategory();
+ category2.setName("category2");
+
+ category3 = getModel1Factory().createCategory();
+ category3.setName("category3");
+
+ category4 = getModel1Factory().createCategory();
+ category4.setName("category4");
+
+ category5 = getModel1Factory().createCategory();
+ category5.setName("category5");
+
+ Category category6 = getModel1Factory().createCategory();
+ category6.setName("category6");
+
+ Category category7 = getModel1Factory().createCategory();
+ category7.setName("category7");
+
+ Category category8 = getModel1Factory().createCategory();
+ category8.setName("category8");
+
+ Category category9 = getModel1Factory().createCategory();
+ category9.setName("category9");
+
+ Category category10 = getModel1Factory().createCategory();
+ category10.setName("category10");
+
+ Category category11 = getModel1Factory().createCategory();
+ category11.setName("category11");
+
+ category1.getCategories().add(category2);
+ category1.getCategories().add(category3);
+ category2.getCategories().add(category4);
+ category2.getCategories().add(category5);
+ category3.getCategories().add(category8);
+ category3.getCategories().add(category9);
+ category4.getCategories().add(category6);
+ category5.getCategories().add(category7);
+ category8.getCategories().add(category10);
+ category9.getCategories().add(category11);
+
+ company = getModel1Factory().createCompany();
+ company.getCategories().add(category1);
+
+ resource.getContents().add(company);
+
+ log("", Collections.singletonList(category1));
+ }
+
+ public void testPartialLockOnCommit() throws Exception
+ {
+ transaction.lockObjects(CDOUtil.getCDOObjects(category1), LockType.WRITE, DEFAULT_TIMEOUT, true);
+
+ // Mark all objects to stay locked on commit
+ transaction.options().addAutoReleaseLocksExemptions(true, category1);
+ assertLockStatus(category1, true, true);
+
+ // Mark category2 to be unlocked on commit
+ transaction.options().removeAutoReleaseLocksExemptions(false, category2);
+ assertLockStatus(category1, true, true);
+
+ // Mark category3 and its descendants to be unlocked on commit
+ transaction.options().removeAutoReleaseLocksExemptions(true, category3);
+ assertLockStatus(category1, true, true);
+
+ transaction.commit();
+ assertLockStatus(category1, true, false);
+ assertLockStatus(category2, false, false);
+ assertLockStatus(category3, false, true);
+ assertLockStatus(category4, true, true);
+ assertLockStatus(category5, true, true);
+ }
+
+ public void testPartialUnlockOnCommit() throws Exception
+ {
+ transaction.lockObjects(CDOUtil.getCDOObjects(category1), LockType.WRITE, DEFAULT_TIMEOUT, true);
+
+ // Mark category1 and its descendants to stay locked on commit
+ transaction.options().addAutoReleaseLocksExemptions(true, category1);
+ assertLockStatus(category1, true, true);
+
+ transaction.unlockObjects(CDOUtil.getCDOObjects(category3), LockType.WRITE, true);
+ assertLockStatus(category3, false, true);
+
+ transaction.commit();
+ assertLockStatus(category1, true, false);
+ assertLockStatus(category2, true, true);
+ assertLockStatus(category3, false, true);
+ }
+
+ private static void assertLockStatus(Category category, boolean expected, boolean recursive)
+ {
+ CDOObject cdoObject = CDOUtil.getCDOObject(category);
+ CDOLockState lockState = cdoObject.cdoLockState();
+
+ assertEquals(
+ "new object " + category.getName() + (expected ? " should be locally locked" : " shouldn't be locally locked."),
+ expected, lockState.isLocked(LockType.WRITE, cdoObject.cdoView(), false));
+
+ if (recursive)
+ {
+ for (Category subCategory : category.getCategories())
+ {
+ assertLockStatus(subCategory, expected, recursive);
+ }
+ }
+ }
+
+ private static void log(String indent, List<Category> categories)
+ {
+ for (Category category : categories)
+ {
+ IOUtil.OUT().println(indent + category.getName() + " --> " + CDOUtil.getCDOObject(category).cdoID());
+ log(indent + " ", category.getCategories());
+ }
+ }
+}

Back to the top