You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2013/03/28 14:41:47 UTC

svn commit: r1462089 - /jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java

Author: thomasm
Date: Thu Mar 28 13:41:47 2013
New Revision: 1462089

URL: http://svn.apache.org/r1462089
Log:
OAK-619 MongoMK: a simple randomized test case (branch / merge)

Modified:
    jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java

Modified: jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java?rev=1462089&r1=1462088&r2=1462089&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java (original)
+++ jackrabbit/oak/trunk/oak-mongomk/src/test/java/org/apache/jackrabbit/mongomk/prototype/RandomizedTest.java Thu Mar 28 13:41:47 2013
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertFal
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.util.HashMap;
 import java.util.Random;
 
 import org.apache.jackrabbit.mk.api.MicroKernelException;
@@ -43,17 +44,37 @@ public class RandomizedTest {
     private MongoMK mk;
     private MicroKernelImpl mkGold;
     
+    private String commitRev;
+    private String commitRevGold;
+    
+    private StringBuilder log;
+
     @Test
     public void addRemoveSetMoveCopy() throws Exception {
+        addRemoveSetMoveCopy(false);
+    }
+    
+    @Test
+    public void addRemoveSetMoveCopyBranchMerge() throws Exception {
+        addRemoveSetMoveCopy(true);
+    }
+    
+    private void addRemoveSetMoveCopy(boolean branchMerge) throws Exception {
         mk = createMK();
         mkGold = new MicroKernelImpl();
+        HashMap<Integer, String> revsGold = new HashMap<Integer, String>();
+        HashMap<Integer, String> revs = new HashMap<Integer, String>();
         Random r = new Random(1);
         int operations = 1000, nodeCount = 10;
         int propertyCount = 5, valueCount = 10;
-        StringBuilder log = new StringBuilder();
+        int maxBackRev = 20;
+        log = new StringBuilder();
         try {
             int maskOk = 0, maskFail = 0;
             int opCount = 5;
+            if (branchMerge) {
+                opCount = 7;
+            }
             for (int i = 0; i < operations; i++) {
                 String node = "t" + r.nextInt(nodeCount);
                 String node2 = "t" + r.nextInt(nodeCount);
@@ -65,29 +86,57 @@ public class RandomizedTest {
                 switch(op) {
                 case 0:
                     diff = "+ \"" + node + "\": { \"" + property + "\": " + value + "}";
-                    log.append(diff).append('\n');
+                    log(diff);
                     result = commit(diff);
                     break;
                 case 1:
                     diff = "- \"" + node + "\"";
-                    log.append(diff).append('\n');
+                    log(diff);
                     result = commit(diff);
                     break;
                 case 2:
                     diff = "^ \"" + node + "/" + property + "\": " + value;
-                    log.append(diff).append('\n');
+                    log(diff);
                     result = commit(diff);
                     break;
                 case 3:
                     diff = "> \"" + node + "\": \"" + node2 + "\"";
-                    log.append(diff).append('\n');
+                    log(diff);
                     result = commit(diff);
                     break;
                 case 4:
                     diff = "* \"" + node + "\": \"" + node2 + "\"";
-                    log.append(diff).append('\n');
+                    log(diff);
                     result = commit(diff);
                     break;
+                case 5:
+                    if (!branchMerge) {
+                        fail();
+                    }
+                    if (commitRevGold == null) {
+                        log("branch");
+                        commitRevGold = mkGold.branch(commitRevGold);
+                        commitRev = mk.branch(commitRev);
+                        result = true;
+                    } else {
+                        result = false;
+                    }
+                    break;
+                case 6:
+                    if (!branchMerge) {
+                        fail();
+                    }
+                    if (commitRevGold != null) {
+                        log("merge");
+                        mkGold.merge(commitRevGold, null);
+                        mk.merge(commitRev, null);
+                        commitRevGold = null;
+                        commitRev = null;
+                        result = true;
+                    } else {
+                        result = false;
+                    }
+                    break;
                 default:
                     fail();
                     result = false;
@@ -99,6 +148,18 @@ public class RandomizedTest {
                 }
                 get(node);
                 get(node2);
+                String revGold = mkGold.getHeadRevision();
+                String rev = mk.getHeadRevision();
+                revsGold.put(i, revGold);
+                revs.put(i, rev);
+                revsGold.remove(i - maxBackRev);
+                revs.remove(i - maxBackRev);
+                int revId = i - r.nextInt(maxBackRev);
+                revGold = revsGold.get(revId);
+                if (revGold != null) {
+                    rev = revs.get(revId);
+                    get(node, revGold, rev);
+                }
             }
             if (Integer.bitCount(maskOk) != opCount) {
                 fail("Not all operations were at least once successful: " + Integer.toBinaryString(maskOk));
@@ -113,11 +174,21 @@ public class RandomizedTest {
         }
         mk.dispose();
         mkGold.dispose();
+        // System.out.println(log);
+        // System.out.println();
+    }
+    
+    private void log(String msg) {
+        log.append(msg).append('\n');
     }
     
     private void get(String node) {
         String headGold = mkGold.getHeadRevision();
         String head = mk.getHeadRevision();
+        get(node, headGold, head);
+    }
+        
+    private void get(String node, String headGold, String head) {
         String p = "/" + node;
         if (!mkGold.nodeExists(p, headGold)) {
             assertFalse(mk.nodeExists(p, head));
@@ -143,18 +214,24 @@ public class RandomizedTest {
     private boolean commit(String diff) {
         boolean ok = false;
         try {
-            mkGold.commit("/", diff, null, null);
+            String r = mkGold.commit("/", diff, commitRevGold, null);
+            if (commitRevGold != null) {
+                commitRevGold = r;
+            }
             ok = true;
         } catch (MicroKernelException e) {
             try {
-                mk.commit("/", diff, null, null);
+                mk.commit("/", diff, commitRev, null);
                 fail("Should fail: " + diff + " with exception " + e);
             } catch (MicroKernelException e2) {
                 // expected
             }
         }
         if (ok) {
-            mk.commit("/", diff, null, null);
+            String r = mk.commit("/", diff, commitRev, null);
+            if (commitRev != null) {
+                commitRev = r;
+            }
         }
         return ok;
     }