You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2011/07/11 18:11:30 UTC

svn commit: r1145226 - in /jackrabbit/trunk/jackrabbit-core: pom.xml src/test/java/org/apache/jackrabbit/core/NodeImplTest.java

Author: reschke
Date: Mon Jul 11 16:11:30 2011
New Revision: 1145226

URL: http://svn.apache.org/viewvc?rev=1145226&view=rev
Log:
JCR-3018 - add test case demonstrating transient space corruption after sequence of failed/successful save() operations

Modified:
    jackrabbit/trunk/jackrabbit-core/pom.xml
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java

Modified: jackrabbit/trunk/jackrabbit-core/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/pom.xml?rev=1145226&r1=1145225&r2=1145226&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/pom.xml (original)
+++ jackrabbit/trunk/jackrabbit-core/pom.xml Mon Jul 11 16:11:30 2011
@@ -101,11 +101,13 @@
               <value>
 org.apache.jackrabbit.core.xml.DocumentViewTest#testMultiValue
 org.apache.jackrabbit.core.ConcurrentImportTest
+org.apache.jackrabbit.core.NodeImplTest#testReferentialIntegrityCorruptionGetPath
 org.apache.jackrabbit.core.integration.ConcurrentQueryTest#testConcurrentQueryWithDeletes
 org.apache.jackrabbit.test.api.ShareableNodeTest#testGetName
 org.apache.jackrabbit.test.api.ShareableNodeTest#testGetNode
 org.apache.jackrabbit.test.api.ShareableNodeTest#testGetNodes
 org.apache.jackrabbit.test.api.ShareableNodeTest#testGetNodesByPattern
+org.apache.jackrabbit.test.api.ShareableNodeTest#testGetNodesByPattern
               </value>
             </property>
             <property>

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java?rev=1145226&r1=1145225&r2=1145226&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/NodeImplTest.java Mon Jul 11 16:11:30 2011
@@ -335,4 +335,66 @@ public class NodeImplTest extends Abstra
         session.save();
     }
 
+    /**
+     * Test corruption in session / persistence state after
+     * {@link ReferentialIntegrityException}.
+     * <p>
+     * This is a variant of {@link #testReferentialIntegrityCorruption()}
+     * that checks that {@link Node#getPath()} works after the save operation.
+     * 
+     * @see <a href="https://issues.apache.org/jira/browse/JCR-3018">JCR-3018</a>
+     */
+    public void testReferentialIntegrityCorruptionGetPath() throws Exception {
+        Session session = testRootNode.getSession();
+        Node root = testRootNode.addNode("testReferentialIntegrityCorruption");
+
+        // Create test nodes P1 and P2
+        Node nodeP1 = root.addNode("P1");
+        nodeP1.addMixin("mix:referenceable");
+        Node nodeP2 = root.addNode("P2");
+        nodeP2.addMixin("mix:referenceable");
+        session.save();
+
+        // Create reference from P2 to P1 and save
+        nodeP2.setProperty("referencetoP1", nodeP1);
+        session.save();
+
+        // Add node P3
+        Node nodeP3 = root.addNode("P3");
+        nodeP3.addMixin("mix:referenceable");
+
+        String nodeP3path = nodeP3.getPath();
+
+        // And try to remove P1 while P2 still references P1
+        nodeP1.remove();
+        try {
+            session.save();
+        } catch (ReferentialIntegrityException expected) {
+            // Got ReferentialIntegrityException as expected
+        }
+
+        // Remove P2 and save again, this will succeed. As P1, P2
+        // should be removed and P3 should exist
+        try {
+            nodeP2.remove();
+            session.save();
+        } catch (Exception e) {
+            String msg = "JCR-3018: Saving delete after"
+                    + " ReferentialIntegrityException failed";
+            log.error(msg, e);
+            fail(msg);
+        }
+
+        try {
+            assertEquals(nodeP3path, nodeP3.getPath());
+            nodeP3 = session.getNodeByIdentifier(nodeP3.getIdentifier());
+        } catch (Exception e) {
+            String msg = "JCR-3018: getting path of P3 failed. Corrupt session?";
+            log.error(msg, e);
+            fail(msg);
+        }
+
+        root.remove();
+        session.save();
+    }
 }