Author: tripod
Date: Fri Mar 14 18:30:27 2014
New Revision: 1577651

URL: http://svn.apache.org/r1577651
Log:
OAK-1541 Concurrent creation of users chokes on intermediate paths

adding an additional test

Modified:
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserManagerImplTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserManagerImplTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserManagerImplTest.java?rev=1577651&r1=1577650&r2=1577651&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserManagerImplTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserManagerImplTest.java
 Fri Mar 14 18:30:27 2014
@@ -18,16 +18,22 @@ package org.apache.jackrabbit.oak.securi
 
 import java.security.Principal;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
+
 import javax.jcr.RepositoryException;
 import javax.jcr.UnsupportedRepositoryOperationException;
 
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.User;
+import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.AbstractSecurityTest;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.ContentSession;
+import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
@@ -36,6 +42,7 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import static junit.framework.Assert.assertEquals;
@@ -52,25 +59,34 @@ public class UserManagerImplTest extends
 
     private UserManagerImpl userMgr;
     private String testUserId = "testUser";
+    private Set<String> beforeAuthorizables = new HashSet<String>();
 
     @Before
     public void before() throws Exception {
         super.before();
 
         userMgr = new UserManagerImpl(root, namePathMapper, 
getSecurityProvider());
+        beforeAuthorizables.clear();
+        Iterator<Authorizable> iter = 
userMgr.findAuthorizables("jcr:primaryType", null, 
UserManager.SEARCH_TYPE_AUTHORIZABLE);
+        while (iter.hasNext()) {
+            beforeAuthorizables.add(iter.next().getID());
+        }
     }
 
     @After
     public void after() throws Exception {
-        try {
-            Authorizable testUser = userMgr.getAuthorizable(testUserId);
-            if (testUser != null) {
-                testUser.remove();
-                root.commit();
+        Iterator<Authorizable> iter = 
userMgr.findAuthorizables("jcr:primaryType", null, 
UserManager.SEARCH_TYPE_AUTHORIZABLE);
+        while (iter.hasNext()) {
+            Authorizable auth = iter.next();
+            if (!beforeAuthorizables.remove(auth.getID())) {
+                try {
+                    auth.remove();
+                } catch (RepositoryException e) {
+                    // ignore
+                }
             }
-        } finally {
-            super.after();
         }
+        super.after();
     }
 
     @Test
@@ -162,7 +178,7 @@ public class UserManagerImplTest extends
         // authNode - authFolder -> create User
         try {
             Principal p = new PrincipalImpl("test2");
-            Authorizable a = userMgr.createUser(p.getName(), p.getName(), p, 
path);
+            userMgr.createUser(p.getName(), p.getName(), p, path);
             root.commit();
 
             fail("Users may not be nested.");
@@ -233,4 +249,40 @@ public class UserManagerImplTest extends
         result = 
userMgr.findAuthorizables("./"+UserConstants.REP_PRINCIPAL_NAME, null);
         assertTrue(result.hasNext());
     }
+
+    @Ignore("OAK-1541")
+    @Test
+    public void testConcurrentCreateUser() throws Exception {
+        final List<Exception> exceptions = new ArrayList<Exception>();
+        List<Thread> workers = new ArrayList<Thread>();
+        for (int i=0; i<10; i++) {
+            final String userId = "foo-user-" + i;
+            workers.add(new Thread(new Runnable() {
+                public void run() {
+                    try {
+                        ContentSession admin = login(getAdminCredentials());
+                        Root root = admin.getLatestRoot();
+                        UserManager userManager = new UserManagerImpl(root, 
namePathMapper, getSecurityProvider());
+                        userManager.createUser(userId, "pass");
+                        root.commit();
+                        admin.close();
+                    } catch (Exception e) {
+                        exceptions.add(e);
+                    }
+                }
+            }));
+        }
+        for (Thread t : workers) {
+            t.start();
+        }
+        for (Thread t : workers) {
+            t.join();
+        }
+        for (Exception e : exceptions) {
+            e.printStackTrace();
+        }
+        if (!exceptions.isEmpty()) {
+            throw exceptions.get(0);
+        }
+    }
 }
\ No newline at end of file


Reply via email to