diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java index d0eeebc916..cb99c18de4 100644 --- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java +++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java @@ -16,6 +16,7 @@ */ package org.apache.jackrabbit.oak.jcr.version; +import java.util.Objects; import java.util.Set; import javax.jcr.Node; @@ -28,11 +29,14 @@ import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.RowIterator; import javax.jcr.version.Version; +import javax.jcr.version.VersionHistory; +import javax.jcr.version.VersionIterator; import javax.jcr.version.VersionManager; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.test.AbstractJCRTest; import org.apache.jackrabbit.test.NotExecutableException; @@ -139,6 +143,50 @@ public class VersionTest extends AbstractJCRTest { } } + // see OAK-8048 + public void testRemoveVersionHistoryWorkaround() throws RepositoryException { + Node n = testRootNode.addNode(nodeName1, testNodeType); + n.addMixin(mixVersionable); + superuser.save(); + + VersionManager vMgr = superuser.getWorkspace().getVersionManager(); + vMgr.checkpoint(n.getPath()); + n.setProperty("modification", 1L); + superuser.save(); + vMgr.checkpoint(n.getPath()); + + final String versionHistoryPath = vMgr.getVersionHistory(n.getPath()).getPath(); + + n.remove(); + superuser.save(); + + final Node vhNode = superuser.getNode(versionHistoryPath); + final String versionableUuid = vhNode.getProperty("jcr:versionableUuid").getString(); + + Node n2 = testRootNode.addNode(nodeName2, testNodeType); + // NOTE: if the mixin is added before setting the uuid, an exception is thrown + n2.setProperty("jcr:uuid", versionableUuid); + n2.addMixin(mixVersionable); + superuser.save(); + + final VersionHistory versionHistory = vMgr.getVersionHistory(n2.getPath()); + final VersionIterator allVersions = versionHistory.getAllVersions(); + while (allVersions.hasNext()) { + final String versionName = allVersions.nextVersion().getName(); + if (!Objects.equals(JcrConstants.JCR_ROOTVERSION, versionName)) { + versionHistory.removeVersion(versionName); + } + } + + assertTrue("version history should exist", superuser.getRootNode().hasNode(versionHistoryPath.substring(1))); + + n2.remove(); + superuser.save(); + + assertFalse("version history should no longer exist", superuser.getRootNode().hasNode(versionHistoryPath.substring(1))); + } + + // OAK-3130 public void testVersionReferences() throws RepositoryException { Node n = testRootNode.addNode(nodeName1, testNodeType);