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 an...@apache.org on 2017/03/14 09:25:47 UTC

svn commit: r1786860 - in /jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user: MembershipBaseTest.java MembershipProviderTest.java MembershipTest.java MembershipWriterTest.java UserValidatorTest.java

Author: angela
Date: Tue Mar 14 09:25:47 2017
New Revision: 1786860

URL: http://svn.apache.org/viewvc?rev=1786860&view=rev
Log:
OAK-5882 : Improve coverage for oak.security code in oak-core (wip)

Added:
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipBaseTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipTest.java
      - copied, changed from r1785987, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipWriterTest.java
      - copied, changed from r1785987, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java
Modified:
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java
    jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserValidatorTest.java

Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipBaseTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipBaseTest.java?rev=1786860&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipBaseTest.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipBaseTest.java Tue Mar 14 09:25:47 2017
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.security.user;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.jcr.RepositoryException;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.apache.jackrabbit.oak.util.TreeUtil;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
+
+public abstract class MembershipBaseTest extends AbstractSecurityTest implements UserConstants {
+
+    static final int SIZE_TH = 10;
+
+    static final int NUM_USERS = 50;
+    static final int NUM_GROUPS = 50;
+
+    UserManagerImpl userMgr;
+    MembershipProvider mp;
+
+    private Set<String> testUsers = new HashSet<String>();
+    private Set<String> testGroups = new HashSet<String>();
+
+    @Before
+    public void before() throws Exception {
+        super.before();
+        userMgr = new UserManagerImpl(root, namePathMapper, getSecurityProvider());
+        mp = userMgr.getMembershipProvider();
+        // set the threshold low for testing
+        mp.setMembershipSizeThreshold(SIZE_TH);
+    }
+
+    @After
+    public void after() throws Exception {
+        try {
+            root.refresh();
+            for (String path : Iterables.concat(testUsers, testGroups)) {
+                Authorizable auth = userMgr.getAuthorizableByPath(path);
+                if (auth != null) {
+                    auth.remove();
+                }
+            }
+            root.commit();
+        } finally {
+            testUsers.clear();
+            testGroups.clear();
+            super.after();
+        }
+    }
+
+    @Nonnull
+    User createUser() throws RepositoryException {
+        String userId = "testUser" + testUsers.size();
+        User usr = userMgr.createUser(userId, "pw");
+        testUsers.add(usr.getPath());
+        return usr;
+    }
+
+    @Nonnull
+    Group createGroup() throws RepositoryException {
+        String groupName = "testGroup" + testGroups.size();
+        Group grp = userMgr.createGroup(groupName);
+        testGroups.add(grp.getPath());
+        return grp;
+    }
+
+
+    @Nonnull
+    List<String> createMembers(@Nonnull Group g, int cnt) throws Exception {
+        List<String> memberPaths = new ArrayList();
+        for (int i = 0; i <= cnt; i++) {
+            User u = createUser();
+            Group gr = createGroup();
+            g.addMembers(u.getID(), gr.getID());
+            memberPaths.add(u.getPath());
+            memberPaths.add(gr.getPath());
+        }
+        return memberPaths;
+    }
+
+    @Nonnull
+    Map<String, String> createIdMap(int start, int end) {
+        Map<String, String> memberIds = Maps.newLinkedHashMap();
+        for (int i = start; i < end; i++) {
+            String memberId = "member" + i;
+            memberIds.put(getContentID(memberId), memberId);
+        }
+        return memberIds;
+    }
+
+    @Nonnull
+    String getContentID(@Nonnull String memberId) {
+        return userMgr.getMembershipProvider().getContentID(memberId, false);
+    }
+
+    @CheckForNull
+    String getContentID(@Nonnull Tree tree) {
+        return TreeUtil.getString(tree, JcrConstants.JCR_UUID);
+    }
+
+    @Nonnull
+    Tree getTree(@Nonnull Authorizable a) throws Exception {
+        return root.getTree(a.getPath());
+    }
+
+    @Nonnull
+    Tree getTree(@Nonnull String path) throws Exception {
+        return root.getTree(path);
+    }
+
+    static void assertMembers(Group grp, Set<String> ms) throws RepositoryException {
+        Set<String> members = new HashSet<String>(ms);
+        Iterator<Authorizable> iter = grp.getMembers();
+        while (iter.hasNext()) {
+            Authorizable member = iter.next();
+            Assert.assertTrue("Group must have member", members.remove(member.getID()));
+        }
+        assertEquals("Group must have all members", 0, members.size());
+    }
+
+    static void assertMemberList(@Nonnull Tree groupTree, int cntRefTrees, int cnt) {
+        Tree list = groupTree.getChild(REP_MEMBERS_LIST);
+        assertTrue(list.exists());
+        assertEquals(cntRefTrees, list.getChildrenCount(5));
+        for (Tree c : list.getChildren()) {
+            PropertyState repMembers = c.getProperty(REP_MEMBERS);
+            assertNotNull(repMembers);
+            assertTrue(SIZE_TH == repMembers.count() || cnt == repMembers.count());
+        }
+    }
+
+}
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java?rev=1786860&r1=1786859&r2=1786860&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java Tue Mar 14 09:25:47 2017
@@ -16,349 +16,130 @@
  */
 package org.apache.jackrabbit.oak.security.user;
 
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.annotation.Nonnull;
-import javax.jcr.RepositoryException;
 
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
-import org.apache.jackrabbit.JcrConstants;
-import org.apache.jackrabbit.api.security.user.Authorizable;
+import com.google.common.collect.Sets;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.User;
-import org.apache.jackrabbit.oak.AbstractSecurityTest;
-import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.apache.jackrabbit.oak.spi.security.user.AuthorizableType;
+import org.apache.jackrabbit.oak.util.NodeUtil;
 import org.apache.jackrabbit.oak.util.TreeUtil;
-import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 
 /**
- * Tests large group and user graphs.
- * <ul>
- * <li>{@link #NUM_USERS} users</li>
- * <li>{@link #NUM_GROUPS} groups</li>
- * <li>1 group with all users</li>
- * <li>1 user with all groups</li>
- * </ul>
- *
  * @since OAK 1.0
  */
-public class MembershipProviderTest extends AbstractSecurityTest implements UserConstants {
-
-    private static final int NUM_USERS = 1000;
-    private static final int NUM_GROUPS = 1000;
-    private static final int SIZE_TH = 10;
-
-    private UserManagerImpl userMgr;
-    private MembershipProvider mp;
-    private Set<String> testUsers = new HashSet<String>();
-    private Set<String> testGroups = new HashSet<String>();
+public class MembershipProviderTest extends MembershipBaseTest {
 
     @Before
     public void before() throws Exception {
         super.before();
-        userMgr = new UserManagerImpl(root, namePathMapper, getSecurityProvider());
-        mp = userMgr.getMembershipProvider();
-        // set the threshold low for testing
-        mp.setMembershipSizeThreshold(SIZE_TH);
-    }
-
-    @After
-    public void after() throws Exception {
-        try {
-            for (String path : Iterables.concat(testUsers, testGroups)) {
-                Authorizable auth = userMgr.getAuthorizableByPath(path);
-                if (auth != null) {
-                    auth.remove();
-                }
-            }
-            root.commit();
-        } finally {
-            testUsers.clear();
-            testGroups.clear();
-            super.after();
-        }
     }
 
     @Test
-    public void testManyMembers() throws Exception {
-        Set<String> members = new HashSet<String>();
-        Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            members.add(usr.getID());
-        }
-        root.commit();
-        assertMembers(grp, members);
+    public void testRemoveMember() throws Exception {
+        Group gr = createGroup();
+        User member = createUser();
+        gr.addMember(member);
 
-        // also check storage structure
-        Tree tree = root.getTree(grp.getPath());
-        assertEquals(
-                "rep:members property must have correct number of references",
-                SIZE_TH,
-                tree.getProperty(REP_MEMBERS).count()
-        );
-
-        Tree membersList = tree.getChild(REP_MEMBERS_LIST);
-        assertTrue(
-                "rep:memberList must exist",
-                membersList.exists()
-        );
-
-        assertEquals(
-                "rep:memberList must have correct primary type.",
-                NT_REP_MEMBER_REFERENCES_LIST,
-                membersList.getProperty(JcrConstants.JCR_PRIMARYTYPE).getValue(Type.STRING)
-        );
-
-        assertEquals(
-                "rep:memberList must have correct number of child nodes.",
-                (NUM_USERS / SIZE_TH) - 1,
-                membersList.getChildrenCount(Long.MAX_VALUE)
-        );
+        assertTrue(mp.removeMember(getTree(gr), getTree(member)));
     }
 
     @Test
-    public void testManyMemberships() throws Exception {
-        Set<String> memberships = new HashSet<String>();
-        User usr = createUser();
-        for (int i = 0; i < NUM_GROUPS; i++) {
-            Group grp = createGroup();
-            grp.addMember(usr);
-            memberships.add(grp.getID());
-        }
-        root.commit();
-
-        Iterator<Group> iter = usr.declaredMemberOf();
-        while (iter.hasNext()) {
-            Group group = iter.next();
-            Assert.assertTrue(memberships.remove(group.getID()));
-        }
-        assertEquals(0, memberships.size());
-    }
+    public void testRemoveMembers() throws Exception {
+        Group gr = createGroup();
+        User member = createUser();
+        Group member2 = createGroup();
+        gr.addMembers(member.getID(), member2.getID());
 
-    @Test
-    public void testNestedMembers() throws Exception {
-        Set<String> members = new HashSet<String>();
-        Set<String> declaredMembers = new HashSet<String>();
-        Group grp = createGroup();
-        for (int i = 0; i < 10; i++) {
-            Group g1 = createGroup();
-            grp.addMember(g1);
-            members.add(g1.getID());
-            declaredMembers.add(g1.getID());
-            for (int j = 0; j < 10; j++) {
-                Group g2 = createGroup();
-                g1.addMember(g2);
-                members.add(g2.getID());
-                for (int k = 0; k < 10; k++) {
-                    User usr = createUser();
-                    g2.addMember(usr);
-                    members.add(usr.getID());
-                }
-            }
-        }
-        root.commit();
+        Map m = Maps.newHashMap();
+        m.put(getContentID(member.getID()), member.getID());
+        m.put(getContentID(member2.getID()), member2.getID());
 
-        assertMembers(grp, members);
 
-        Iterator<Authorizable> iter = grp.getDeclaredMembers();
-        while (iter.hasNext()) {
-            Authorizable member = iter.next();
-            Assert.assertTrue(declaredMembers.remove(member.getID()));
-        }
-        assertEquals(0, declaredMembers.size());
+        Set<String> failed = mp.removeMembers(getTree(gr), m);
+        assertTrue(failed.isEmpty());
     }
 
-    @Test
-    public void testNestedMemberships() throws Exception {
-        Set<String> memberships = new HashSet<String>();
-        User user = createUser();
-        Group grp = createGroup();
-        memberships.add(grp.getID());
-        for (int i = 0; i < 10; i++) {
-            Group g1 = createGroup();
-            grp.addMember(g1);
-            memberships.add(g1.getID());
-            for (int j = 0; j < 10; j++) {
-                Group g2 = createGroup();
-                g1.addMember(g2);
-                memberships.add(g2.getID());
-                g2.addMember(user);
-            }
-        }
-        root.commit();
 
-        Iterator<Group> iter = user.memberOf();
-        while (iter.hasNext()) {
-            Group group = iter.next();
-            Assert.assertTrue(memberships.remove(group.getID()));
-        }
-        assertEquals(0, memberships.size());
+    @Test
+    public void testRemoveNonMember() throws Exception {
+        assertFalse(mp.removeMember(getTree(createGroup()), getTree(getTestUser())));
     }
 
     @Test
-    public void testRemoveMembers() throws Exception {
-        Set<String> members = new HashSet<String>();
-        String[] users = new String[NUM_USERS];
-        Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            members.add(usr.getID());
-            users[i] = usr.getID();
-        }
-        root.commit();
+    public void testRemoveNonMembers() throws Exception {
+        Map<String, String> nonMemberIds = createIdMap(1, 5);
 
-        // remove the first TH users, this should remove all references from rep:members in the group node and remove
-        // the rep:members property
-        for (int i = 0; i < SIZE_TH; i++) {
-            Authorizable auth = userMgr.getAuthorizable(users[i]);
-            members.remove(users[i]);
-            grp.removeMember(auth);
-        }
-        root.commit();
-
-        assertMembers(grp, members);
-
-        // also check storage structure
-        Tree tree = root.getTree(grp.getPath());
-        assertNull(
-                "rep:members property not exist",
-                tree.getProperty(REP_MEMBERS)
-        );
-
-        // now add TH/2 again.
-        for (int i = 0; i < SIZE_TH / 2; i++) {
-            Authorizable auth = userMgr.getAuthorizable(users[i]);
-            members.add(users[i]);
-            grp.addMember(auth);
-        }
-        root.commit();
-
-        assertEquals(
-                "rep:members property must have correct number of references",
-                SIZE_TH / 2,
-                tree.getProperty(REP_MEMBERS).count()
-        );
-        assertMembers(grp, members);
-
-        // now remove the users 20-30, this should remove the 2nd overflow node
-        for (int i = 2 * SIZE_TH; i < (3 * SIZE_TH); i++) {
-            Authorizable auth = userMgr.getAuthorizable(users[i]);
-            members.remove(users[i]);
-            grp.removeMember(auth);
-        }
-        root.commit();
-
-        assertMembers(grp, members);
-
-        Tree membersList = tree.getChild(REP_MEMBERS_LIST);
-        assertFalse(
-                "the first overflow node must not exist",
-                membersList.getChild("1").exists()
-        );
-
-        // now add 10 users and check if the "1" node exists again
-        for (int i = 2 * SIZE_TH; i < (3 * SIZE_TH); i++) {
-            Authorizable auth = userMgr.getAuthorizable(users[i]);
-            members.add(users[i]);
-            grp.addMember(auth);
-        }
-        root.commit();
-        assertMembers(grp, members);
-
-        membersList = tree.getChild(REP_MEMBERS_LIST);
-        assertTrue("the first overflow node must not exist", membersList.getChild("1").exists()
-        );
+        Set<String> expected = Sets.newHashSet(nonMemberIds.values());
+        Set<String> failed = mp.removeMembers(getTree(createGroup()), nonMemberIds);
+        assertEquals(expected, failed);
     }
 
     @Test
-    public void testAddMembersAgain() throws Exception {
-        Set<String> members = new HashSet<String>();
+    public void testAddMemberAgain() throws Exception {
         Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            members.add(usr.getID());
-        }
+        List<String> memberPaths = createMembers(grp, NUM_USERS);
         root.commit();
 
-        for (String id : members) {
-            assertFalse(grp.addMember(userMgr.getAuthorizable(id)));
+        Tree groupTree = root.getTree(grp.getPath());
+        for (String path : memberPaths) {
+            Tree memberTree = root.getTree(path);
+            assertFalse(mp.addMember(groupTree, memberTree));
         }
     }
 
     @Test
-    public void testAddMembersAgainOnMembershipProvider() throws Exception {
-        Set<String> memberPaths = new HashSet<String>();
+    public void testAddMembersAgain() throws Exception {
         Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            memberPaths.add(usr.getPath());
-        }
+        List<String> memberPaths = createMembers(grp, NUM_USERS);
         root.commit();
 
-        Tree groupTree = root.getTree(grp.getPath());
+        Map<String, String> m = new HashMap();
         for (String path : memberPaths) {
             Tree memberTree = root.getTree(path);
-            assertFalse(mp.addMember(groupTree, memberTree));
-            assertFalse(mp.addMember(groupTree, memberTree));
-
             String memberId = TreeUtil.getString(memberTree, REP_AUTHORIZABLE_ID);
-            Map<String, String> m = new HashMap<String, String>(1);
-            m.put(TreeUtil.getString(memberTree, JcrConstants.JCR_UUID), memberId);
-
-            Set<String> failed = mp.addMembers(groupTree, m);
-            assertFalse(failed.isEmpty());
-            assertTrue(failed.contains(memberId));
+            m.put(getContentID(memberTree), memberId);
         }
+
+        Set<String> expected = Sets.newHashSet(m.values());
+        Set<String> failed = mp.addMembers(getTree(grp), m);
+        assertFalse(failed.isEmpty());
+        assertEquals(expected, failed);
     }
 
     @Test
     public void testIsDeclaredMemberTransient() throws Exception {
         Group g = createGroup();
-        List<Authorizable> members = createMembers(g, NUM_USERS/2);
-
-        Tree groupTree = getTree(g);
+        List<String> memberPaths = createMembers(g, NUM_USERS/2);
 
         // test declared members with transient modifications
-        for (Authorizable a : members) {
-            assertTrue(mp.isDeclaredMember(groupTree, getTree(a)));
+        for (String path : memberPaths) {
+            assertTrue(mp.isDeclaredMember(getTree(g), getTree(path)));
         }
     }
 
     @Test
     public void testIsDeclaredMember() throws Exception {
         Group g = createGroup();
-        List<Authorizable> members = createMembers(g, NUM_USERS/2);
+        List<String> memberPaths = createMembers(g, NUM_USERS/2);
         root.commit();
 
-        Tree groupTree = getTree(g);
-
         // test declared members after commit
-        for (Authorizable a : members) {
-            assertTrue(mp.isDeclaredMember(groupTree, getTree(a)));
+        for (String path : memberPaths) {
+            assertTrue(mp.isDeclaredMember(getTree(g), getTree(path)));
         }
     }
 
@@ -371,7 +152,6 @@ public class MembershipProviderTest exte
         g.addMembers(m1.getID(), m2.getID());
 
         Tree groupTree = getTree(g);
-        assertFalse(groupTree.hasChild(REP_MEMBERS_LIST));
 
         // test declared members with transient modifications
         assertTrue(mp.isDeclaredMember(groupTree, getTree(m1)));
@@ -384,18 +164,40 @@ public class MembershipProviderTest exte
     }
 
     @Test
+    public void testIsDeclaredMemberMissingMembersProperty() throws Exception {
+        Tree grTree = getTree(createGroup());
+        Tree memberTree = getTree(createUser());
+
+        NodeUtil memberList = new NodeUtil(grTree).addChild(REP_MEMBERS_LIST, NT_REP_MEMBER_REFERENCES_LIST);
+        memberList.addChild("member1", NT_REP_MEMBER_REFERENCES).setStrings(REP_MEMBERS, getContentID(memberTree));
+
+        assertTrue(mp.isDeclaredMember(grTree, memberTree));
+    }
+
+    @Test
+    public void testNotIsDeclaredMemberMissingMembersProperty() throws Exception {
+        Tree grTree = getTree(createGroup());
+        Tree memberTree = getTree(createUser());
+
+        NodeUtil memberList = new NodeUtil(grTree).addChild(REP_MEMBERS_LIST, NT_REP_MEMBER_REFERENCES_LIST);
+        memberList.addChild("member1", NT_REP_MEMBER_REFERENCES).setStrings(REP_MEMBERS, getContentID("another"));
+
+        assertFalse(mp.isDeclaredMember(grTree, memberTree));
+    }
+
+    @Test
     public void testIsMemberTransient() throws Exception {
         Group g = createGroup();
         Group g2 = createGroup();
         g.addMember(g2);
 
-        List<Authorizable> members = createMembers(g2, 50);
+        List<String> memberPaths = createMembers(g2, NUM_USERS);
 
         Tree groupTree = getTree(g);
 
         // test members with transient modifications
-        for (Authorizable a : members) {
-            Tree tree = getTree(a);
+        for (String path : memberPaths) {
+            Tree tree = getTree(path);
             assertFalse(mp.isDeclaredMember(groupTree, tree));
             assertTrue(mp.isMember(groupTree, tree));
         }
@@ -407,13 +209,13 @@ public class MembershipProviderTest exte
         Group g2 = createGroup();
         g.addMember(g2);
 
-        List<Authorizable> members = createMembers(g2, NUM_USERS/2);
+        List<String> memberPaths = createMembers(g2, NUM_USERS/2);
         root.commit();
 
         // test members after commit
         Tree groupTree = getTree(g);
-        for (Authorizable a : members) {
-            Tree tree = getTree(a);
+        for (String path : memberPaths) {
+            Tree tree = getTree(path);
             assertFalse(mp.isDeclaredMember(groupTree, tree));
             assertTrue(mp.isMember(groupTree, tree));
         }
@@ -471,133 +273,125 @@ public class MembershipProviderTest exte
 
     @Test
     public void testNoMember() throws Exception {
-        Group g = createGroup();
-        Group notMember = createGroup();
-        User notMember2 = createUser();
+        Tree groupTree = getTree(createGroup());
+        Tree notMember = getTree(createGroup());
+        Tree notMember2 = getTree(createUser());
 
-        assertFalse(g.isDeclaredMember(notMember));
-        assertFalse(g.isDeclaredMember(notMember2));
+        assertFalse(mp.isDeclaredMember(groupTree, notMember));
+        assertFalse(mp.isDeclaredMember(groupTree, notMember2));
 
-        assertFalse(g.isMember(notMember));
-        assertFalse(g.isMember(notMember2));
+        assertFalse(mp.isMember(groupTree, notMember));
+        assertFalse(mp.isMember(groupTree, notMember2));
 
         root.commit();
 
-        assertFalse(g.isDeclaredMember(notMember));
-        assertFalse(g.isDeclaredMember(notMember2));
+        assertFalse(mp.isDeclaredMember(groupTree, notMember));
+        assertFalse(mp.isDeclaredMember(groupTree, notMember2));
 
-        assertFalse(g.isMember(notMember));
-        assertFalse(g.isMember(notMember2));
+        assertFalse(mp.isMember(groupTree, notMember));
+        assertFalse(mp.isMember(groupTree, notMember2));
     }
 
     @Test
-    public void testAddMembersExceedThreshold() throws Exception {
-        Tree groupTree = root.getTree(createGroup().getPath());
+    public void testGetMembersWithRemoved() throws Exception {
+        Group g = createGroup();
+        Group member = createGroup();
+        g.addMember(member);
+        member.remove();
+        root.commit();
+
+        assertFalse(mp.getMembers(getTree(g), AuthorizableType.AUTHORIZABLE, false).hasNext());
+        assertFalse(mp.getMembers(getTree(g), AuthorizableType.AUTHORIZABLE, true).hasNext());
+    }
 
-        // 1. add array of 21 memberIDs exceeding the threshold
-        Map<String, String> memberIds = createIdMap(0, 21);
-        mp.addMembers(groupTree, memberIds);
+    @Test
+    public void testGetMembersInherited() throws Exception {
+        Group g = createGroup();
+        Group member = createGroup();
+        g.addMember(member);
+        member.addMember(createUser());
+        root.commit();
 
-        PropertyState repMembers = groupTree.getProperty(REP_MEMBERS);
-        assertNotNull(repMembers);
-        assertEquals(SIZE_TH, repMembers.count());
+        Iterator<String> res = mp.getMembers(getTree(g), AuthorizableType.AUTHORIZABLE, true);
+        assertEquals(2, Iterators.size(res));
+    }
 
-        // the members-list must how have two ref-members nodes one with 10 and
-        // one with a single ref-value
-        assertMemberList(groupTree, 2, 1);
+    @Test
+    public void testGetMembersWithDuplicates() throws Exception {
+        Group g = createGroup();
+        Group member = createGroup();
+        g.addMember(member);
 
-        // 2. add more members without reaching threshold => still 2 ref-nodes
-        memberIds = createIdMap(21, 29);
-        mp.addMembers(groupTree, memberIds);
-        assertMemberList(groupTree, 2, 9);
+        User user = createUser();
+        member.addMember(user);
+        g.addMember(user);
+        root.commit();
 
-        // 3. fill up second ref-members node => a new one must be created
-        memberIds = createIdMap(29, 35);
-        mp.addMembers(groupTree, memberIds);
-        assertMemberList(groupTree, 3, 5);
+        Iterator<String> res = mp.getMembers(getTree(g), AuthorizableType.AUTHORIZABLE, true);
+        assertEquals(2, Iterators.size(res));
+    }
 
-        // 4. remove members from the initial set => ref nodes as before, rep:members prop on group modified
-        memberIds.clear();
-        memberIds.put(MembershipProvider.getContentID("member1", false), "member1");
-        memberIds.put(MembershipProvider.getContentID("member2", false), "member2");
-        mp.removeMembers(groupTree, Maps.newHashMap(memberIds));
+    @Test
+    public void testGetMembers() throws Exception {
+        Group g = createGroup();
+        Group member = createGroup();
+        g.addMember(member);
+        member.addMember(createUser());
+        root.commit();
 
-        assertMemberList(groupTree, 3, 5);
-        assertEquals(8, groupTree.getProperty(REP_MEMBERS).count());
+        Iterator<String> res = mp.getMembers(getTree(g), AuthorizableType.AUTHORIZABLE, false);
+        assertEquals(1, Iterators.size(res));
+    }
 
-        // 5. add members again => best-tree is the ref-member-node
-        memberIds = createIdMap(35, 39);
-        mp.addMembers(groupTree, memberIds);
+    @Test
+    public void testGetMembershipInherited() throws Exception {
+        User user = createUser();
+        Group g = createGroup();
+        Group member = createGroup();
+        Group member2 = createGroup();
 
-        assertEquals(8, groupTree.getProperty(REP_MEMBERS).count());
-        assertMemberList(groupTree, 3, 9);
+        g.addMember(member);
+        member.addMember(member2);
+        member2.addMember(user);
 
-        // 6. adding more members will fill up rep:members again and create new ref-node
-        memberIds = createIdMap(39, 45);
-        mp.addMembers(groupTree, memberIds);
+        root.commit();
 
-        assertEquals(SIZE_TH, groupTree.getProperty(REP_MEMBERS).count());
-        assertEquals(4, groupTree.getChild(REP_MEMBERS_LIST).getChildrenCount(10));
+        Iterator<String> res = mp.getMembership(getTree(user), true);
+        assertEquals(3, Iterators.size(res));
     }
 
-    private User createUser() throws RepositoryException {
-        String userId = "testUser" + testUsers.size();
-        User usr = userMgr.createUser(userId, "pw");
-        testUsers.add(usr.getPath());
-        return usr;
-    }
+    @Test
+    public void testGetMembershipWithDuplicates() throws Exception {
+        User user = createUser();
+        Group g = createGroup();
+        Group member = createGroup();
+        Group member2 = createGroup();
 
-    private Group createGroup() throws RepositoryException {
-        String groupName = "testGroup" + testGroups.size();
-        Group grp = userMgr.createGroup(groupName);
-        testGroups.add(grp.getPath());
-        return grp;
-    }
+        g.addMember(member);
+        g.addMember(member2);
+        member.addMember(member2);
+        member2.addMember(user);
 
-    private List<Authorizable> createMembers(@Nonnull Group g, int cnt) throws Exception {
-        List<Authorizable> members = new ArrayList();
-        for (int i = 0; i <= cnt; i++) {
-            User u = createUser();
-            Group gr = createGroup();
-            g.addMembers(u.getID(), gr.getID());
-            members.add(u);
-            members.add(gr);
-        }
-        return members;
-    }
+        root.commit();
 
-    private static Map<String, String> createIdMap(int start, int end) {
-        Map<String, String> memberIds = Maps.newLinkedHashMap();
-        for (int i = start; i < end; i++) {
-            String memberId = "member" + i;
-            //TODO
-            memberIds.put(MembershipProvider.getContentID(memberId, false), memberId);
-        }
-        return memberIds;
+        Iterator<String> res = mp.getMembership(getTree(user), true);
+        assertEquals(3, Iterators.size(res));
     }
 
-    private static void assertMembers(Group grp, Set<String> ms) throws RepositoryException {
-        Set<String> members = new HashSet<String>(ms);
-        Iterator<Authorizable> iter = grp.getMembers();
-        while (iter.hasNext()) {
-            Authorizable member = iter.next();
-            Assert.assertTrue("Group must have member", members.remove(member.getID()));
-        }
-        assertEquals("Group must have all members", 0, members.size());
-    }
+    @Test
+    public void testGetMembership() throws Exception {
+        User user = createUser();
+        Group g = createGroup();
+        Group member = createGroup();
+        Group member2 = createGroup();
 
-    private static void assertMemberList(@Nonnull Tree groupTree, int cntRefTrees, int cnt) {
-        Tree list = groupTree.getChild(REP_MEMBERS_LIST);
-        assertTrue(list.exists());
-        assertEquals(cntRefTrees, list.getChildrenCount(5));
-        for (Tree c : list.getChildren()) {
-            PropertyState repMembers = c.getProperty(REP_MEMBERS);
-            assertNotNull(repMembers);
-            assertTrue(SIZE_TH == repMembers.count() || cnt == repMembers.count());
-        }
-    }
+        g.addMember(member);
+        member.addMember(member2);
+        member2.addMember(user);
+
+        root.commit();
 
-    private Tree getTree(@Nonnull Authorizable a) throws Exception {
-        return root.getTree(a.getPath());
+        Iterator<String> res = mp.getMembership(getTree(user), false);
+        assertEquals(1, Iterators.size(res));
     }
 }
\ No newline at end of file

Copied: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipTest.java (from r1785987, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipTest.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipTest.java&p1=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java&r1=1785987&r2=1786860&rev=1786860&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipTest.java Tue Mar 14 09:25:47 2017
@@ -16,132 +16,46 @@
  */
 package org.apache.jackrabbit.oak.security.user;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
 import java.util.Set;
-import javax.annotation.Nonnull;
-import javax.jcr.RepositoryException;
 
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Iterators;
-import com.google.common.collect.Maps;
-import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.User;
-import org.apache.jackrabbit.oak.AbstractSecurityTest;
-import org.apache.jackrabbit.oak.api.PropertyState;
-import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
-import org.apache.jackrabbit.oak.util.TreeUtil;
-import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 
 /**
  * Tests large group and user graphs.
+ *
  * <ul>
  * <li>{@link #NUM_USERS} users</li>
  * <li>{@link #NUM_GROUPS} groups</li>
  * <li>1 group with all users</li>
  * <li>1 user with all groups</li>
- * </ul>
+  * </ul>
  *
  * @since OAK 1.0
  */
-public class MembershipProviderTest extends AbstractSecurityTest implements UserConstants {
+public class MembershipTest extends MembershipBaseTest {
 
-    private static final int NUM_USERS = 1000;
-    private static final int NUM_GROUPS = 1000;
-    private static final int SIZE_TH = 10;
-
-    private UserManagerImpl userMgr;
-    private MembershipProvider mp;
-    private Set<String> testUsers = new HashSet<String>();
-    private Set<String> testGroups = new HashSet<String>();
+    private static final int MANY_USERS = 1000;
 
     @Before
     public void before() throws Exception {
         super.before();
-        userMgr = new UserManagerImpl(root, namePathMapper, getSecurityProvider());
-        mp = userMgr.getMembershipProvider();
-        // set the threshold low for testing
-        mp.setMembershipSizeThreshold(SIZE_TH);
-    }
-
-    @After
-    public void after() throws Exception {
-        try {
-            for (String path : Iterables.concat(testUsers, testGroups)) {
-                Authorizable auth = userMgr.getAuthorizableByPath(path);
-                if (auth != null) {
-                    auth.remove();
-                }
-            }
-            root.commit();
-        } finally {
-            testUsers.clear();
-            testGroups.clear();
-            super.after();
-        }
-    }
-
-    @Test
-    public void testManyMembers() throws Exception {
-        Set<String> members = new HashSet<String>();
-        Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            members.add(usr.getID());
-        }
-        root.commit();
-        assertMembers(grp, members);
-
-        // also check storage structure
-        Tree tree = root.getTree(grp.getPath());
-        assertEquals(
-                "rep:members property must have correct number of references",
-                SIZE_TH,
-                tree.getProperty(REP_MEMBERS).count()
-        );
-
-        Tree membersList = tree.getChild(REP_MEMBERS_LIST);
-        assertTrue(
-                "rep:memberList must exist",
-                membersList.exists()
-        );
-
-        assertEquals(
-                "rep:memberList must have correct primary type.",
-                NT_REP_MEMBER_REFERENCES_LIST,
-                membersList.getProperty(JcrConstants.JCR_PRIMARYTYPE).getValue(Type.STRING)
-        );
-
-        assertEquals(
-                "rep:memberList must have correct number of child nodes.",
-                (NUM_USERS / SIZE_TH) - 1,
-                membersList.getChildrenCount(Long.MAX_VALUE)
-        );
     }
 
     @Test
     public void testManyMemberships() throws Exception {
         Set<String> memberships = new HashSet<String>();
         User usr = createUser();
-        for (int i = 0; i < NUM_GROUPS; i++) {
+        for (int i = 0; i < MANY_USERS; i++) {
             Group grp = createGroup();
             grp.addMember(usr);
             memberships.add(grp.getID());
@@ -217,86 +131,10 @@ public class MembershipProviderTest exte
     }
 
     @Test
-    public void testRemoveMembers() throws Exception {
-        Set<String> members = new HashSet<String>();
-        String[] users = new String[NUM_USERS];
-        Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            members.add(usr.getID());
-            users[i] = usr.getID();
-        }
-        root.commit();
-
-        // remove the first TH users, this should remove all references from rep:members in the group node and remove
-        // the rep:members property
-        for (int i = 0; i < SIZE_TH; i++) {
-            Authorizable auth = userMgr.getAuthorizable(users[i]);
-            members.remove(users[i]);
-            grp.removeMember(auth);
-        }
-        root.commit();
-
-        assertMembers(grp, members);
-
-        // also check storage structure
-        Tree tree = root.getTree(grp.getPath());
-        assertNull(
-                "rep:members property not exist",
-                tree.getProperty(REP_MEMBERS)
-        );
-
-        // now add TH/2 again.
-        for (int i = 0; i < SIZE_TH / 2; i++) {
-            Authorizable auth = userMgr.getAuthorizable(users[i]);
-            members.add(users[i]);
-            grp.addMember(auth);
-        }
-        root.commit();
-
-        assertEquals(
-                "rep:members property must have correct number of references",
-                SIZE_TH / 2,
-                tree.getProperty(REP_MEMBERS).count()
-        );
-        assertMembers(grp, members);
-
-        // now remove the users 20-30, this should remove the 2nd overflow node
-        for (int i = 2 * SIZE_TH; i < (3 * SIZE_TH); i++) {
-            Authorizable auth = userMgr.getAuthorizable(users[i]);
-            members.remove(users[i]);
-            grp.removeMember(auth);
-        }
-        root.commit();
-
-        assertMembers(grp, members);
-
-        Tree membersList = tree.getChild(REP_MEMBERS_LIST);
-        assertFalse(
-                "the first overflow node must not exist",
-                membersList.getChild("1").exists()
-        );
-
-        // now add 10 users and check if the "1" node exists again
-        for (int i = 2 * SIZE_TH; i < (3 * SIZE_TH); i++) {
-            Authorizable auth = userMgr.getAuthorizable(users[i]);
-            members.add(users[i]);
-            grp.addMember(auth);
-        }
-        root.commit();
-        assertMembers(grp, members);
-
-        membersList = tree.getChild(REP_MEMBERS_LIST);
-        assertTrue("the first overflow node must not exist", membersList.getChild("1").exists()
-        );
-    }
-
-    @Test
     public void testAddMembersAgain() throws Exception {
         Set<String> members = new HashSet<String>();
         Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
+        for (int i = 0; i < MANY_USERS; i++) {
             User usr = createUser();
             grp.addMember(usr);
             members.add(usr.getID());
@@ -307,297 +145,4 @@ public class MembershipProviderTest exte
             assertFalse(grp.addMember(userMgr.getAuthorizable(id)));
         }
     }
-
-    @Test
-    public void testAddMembersAgainOnMembershipProvider() throws Exception {
-        Set<String> memberPaths = new HashSet<String>();
-        Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            memberPaths.add(usr.getPath());
-        }
-        root.commit();
-
-        Tree groupTree = root.getTree(grp.getPath());
-        for (String path : memberPaths) {
-            Tree memberTree = root.getTree(path);
-            assertFalse(mp.addMember(groupTree, memberTree));
-            assertFalse(mp.addMember(groupTree, memberTree));
-
-            String memberId = TreeUtil.getString(memberTree, REP_AUTHORIZABLE_ID);
-            Map<String, String> m = new HashMap<String, String>(1);
-            m.put(TreeUtil.getString(memberTree, JcrConstants.JCR_UUID), memberId);
-
-            Set<String> failed = mp.addMembers(groupTree, m);
-            assertFalse(failed.isEmpty());
-            assertTrue(failed.contains(memberId));
-        }
-    }
-
-    @Test
-    public void testIsDeclaredMemberTransient() throws Exception {
-        Group g = createGroup();
-        List<Authorizable> members = createMembers(g, NUM_USERS/2);
-
-        Tree groupTree = getTree(g);
-
-        // test declared members with transient modifications
-        for (Authorizable a : members) {
-            assertTrue(mp.isDeclaredMember(groupTree, getTree(a)));
-        }
-    }
-
-    @Test
-    public void testIsDeclaredMember() throws Exception {
-        Group g = createGroup();
-        List<Authorizable> members = createMembers(g, NUM_USERS/2);
-        root.commit();
-
-        Tree groupTree = getTree(g);
-
-        // test declared members after commit
-        for (Authorizable a : members) {
-            assertTrue(mp.isDeclaredMember(groupTree, getTree(a)));
-        }
-    }
-
-    @Test
-    public void testIsDeclaredMemberFew() throws Exception {
-        Group g = createGroup();
-        Group m1 = createGroup();
-        User m2 = createUser();
-
-        g.addMembers(m1.getID(), m2.getID());
-
-        Tree groupTree = getTree(g);
-        assertFalse(groupTree.hasChild(REP_MEMBERS_LIST));
-
-        // test declared members with transient modifications
-        assertTrue(mp.isDeclaredMember(groupTree, getTree(m1)));
-        assertTrue(mp.isDeclaredMember(groupTree, getTree(m2)));
-
-        // ... and after commit
-        root.commit();
-        assertTrue(mp.isDeclaredMember(groupTree, getTree(m1)));
-        assertTrue(mp.isDeclaredMember(groupTree, getTree(m2)));
-    }
-
-    @Test
-    public void testIsMemberTransient() throws Exception {
-        Group g = createGroup();
-        Group g2 = createGroup();
-        g.addMember(g2);
-
-        List<Authorizable> members = createMembers(g2, 50);
-
-        Tree groupTree = getTree(g);
-
-        // test members with transient modifications
-        for (Authorizable a : members) {
-            Tree tree = getTree(a);
-            assertFalse(mp.isDeclaredMember(groupTree, tree));
-            assertTrue(mp.isMember(groupTree, tree));
-        }
-    }
-
-    @Test
-    public void testIsMember() throws Exception {
-        Group g = createGroup();
-        Group g2 = createGroup();
-        g.addMember(g2);
-
-        List<Authorizable> members = createMembers(g2, NUM_USERS/2);
-        root.commit();
-
-        // test members after commit
-        Tree groupTree = getTree(g);
-        for (Authorizable a : members) {
-            Tree tree = getTree(a);
-            assertFalse(mp.isDeclaredMember(groupTree, tree));
-            assertTrue(mp.isMember(groupTree, tree));
-        }
-    }
-
-    @Test
-    public void testIsMemberFew() throws Exception {
-        Group g = createGroup();
-        Group g2 = createGroup();
-        g.addMember(g2);
-
-        User m1 = createUser();
-        Group m2 = createGroup();
-        g2.addMember(m1);
-        g2.addMember(m2);
-
-        Tree groupTree = getTree(g);
-
-        // test members with transient modifications
-        assertFalse(mp.isDeclaredMember(groupTree, getTree(m1)));
-        assertFalse(mp.isDeclaredMember(groupTree, getTree(m2)));
-        assertTrue(mp.isMember(groupTree, getTree(m1)));
-        assertTrue(mp.isMember(groupTree, getTree(m2)));
-
-        // ... and after commit
-        root.commit();
-        assertFalse(mp.isDeclaredMember(groupTree, getTree(m1)));
-        assertFalse(mp.isDeclaredMember(groupTree, getTree(m2)));
-        assertTrue(mp.isMember(groupTree, getTree(m1)));
-        assertTrue(mp.isMember(groupTree, getTree(m2)));
-    }
-
-    @Test
-    public void testTransientInMembersList() throws Exception {
-        Group g = createGroup();
-        createMembers(g, NUM_USERS/2);
-        root.commit();
-
-        // add another transient member that will end up in the members-ref-list
-        User u = createUser();
-        g.addMember(u);
-
-        Tree groupTree = getTree(g);
-        Tree memberTree = getTree(u);
-
-        assertTrue(mp.isDeclaredMember(groupTree, memberTree));
-        assertTrue(mp.isMember(groupTree, memberTree));
-
-        assertFalse(Iterators.contains(mp.getMembership(memberTree, false), groupTree.getPath()));
-        assertFalse(Iterators.contains(mp.getMembership(memberTree, true), groupTree.getPath()));
-        root.commit();
-        assertTrue(Iterators.contains(mp.getMembership(memberTree, false), groupTree.getPath()));
-        assertTrue(Iterators.contains(mp.getMembership(memberTree, true), groupTree.getPath()));
-    }
-
-    @Test
-    public void testNoMember() throws Exception {
-        Group g = createGroup();
-        Group notMember = createGroup();
-        User notMember2 = createUser();
-
-        assertFalse(g.isDeclaredMember(notMember));
-        assertFalse(g.isDeclaredMember(notMember2));
-
-        assertFalse(g.isMember(notMember));
-        assertFalse(g.isMember(notMember2));
-
-        root.commit();
-
-        assertFalse(g.isDeclaredMember(notMember));
-        assertFalse(g.isDeclaredMember(notMember2));
-
-        assertFalse(g.isMember(notMember));
-        assertFalse(g.isMember(notMember2));
-    }
-
-    @Test
-    public void testAddMembersExceedThreshold() throws Exception {
-        Tree groupTree = root.getTree(createGroup().getPath());
-
-        // 1. add array of 21 memberIDs exceeding the threshold
-        Map<String, String> memberIds = createIdMap(0, 21);
-        mp.addMembers(groupTree, memberIds);
-
-        PropertyState repMembers = groupTree.getProperty(REP_MEMBERS);
-        assertNotNull(repMembers);
-        assertEquals(SIZE_TH, repMembers.count());
-
-        // the members-list must how have two ref-members nodes one with 10 and
-        // one with a single ref-value
-        assertMemberList(groupTree, 2, 1);
-
-        // 2. add more members without reaching threshold => still 2 ref-nodes
-        memberIds = createIdMap(21, 29);
-        mp.addMembers(groupTree, memberIds);
-        assertMemberList(groupTree, 2, 9);
-
-        // 3. fill up second ref-members node => a new one must be created
-        memberIds = createIdMap(29, 35);
-        mp.addMembers(groupTree, memberIds);
-        assertMemberList(groupTree, 3, 5);
-
-        // 4. remove members from the initial set => ref nodes as before, rep:members prop on group modified
-        memberIds.clear();
-        memberIds.put(MembershipProvider.getContentID("member1", false), "member1");
-        memberIds.put(MembershipProvider.getContentID("member2", false), "member2");
-        mp.removeMembers(groupTree, Maps.newHashMap(memberIds));
-
-        assertMemberList(groupTree, 3, 5);
-        assertEquals(8, groupTree.getProperty(REP_MEMBERS).count());
-
-        // 5. add members again => best-tree is the ref-member-node
-        memberIds = createIdMap(35, 39);
-        mp.addMembers(groupTree, memberIds);
-
-        assertEquals(8, groupTree.getProperty(REP_MEMBERS).count());
-        assertMemberList(groupTree, 3, 9);
-
-        // 6. adding more members will fill up rep:members again and create new ref-node
-        memberIds = createIdMap(39, 45);
-        mp.addMembers(groupTree, memberIds);
-
-        assertEquals(SIZE_TH, groupTree.getProperty(REP_MEMBERS).count());
-        assertEquals(4, groupTree.getChild(REP_MEMBERS_LIST).getChildrenCount(10));
-    }
-
-    private User createUser() throws RepositoryException {
-        String userId = "testUser" + testUsers.size();
-        User usr = userMgr.createUser(userId, "pw");
-        testUsers.add(usr.getPath());
-        return usr;
-    }
-
-    private Group createGroup() throws RepositoryException {
-        String groupName = "testGroup" + testGroups.size();
-        Group grp = userMgr.createGroup(groupName);
-        testGroups.add(grp.getPath());
-        return grp;
-    }
-
-    private List<Authorizable> createMembers(@Nonnull Group g, int cnt) throws Exception {
-        List<Authorizable> members = new ArrayList();
-        for (int i = 0; i <= cnt; i++) {
-            User u = createUser();
-            Group gr = createGroup();
-            g.addMembers(u.getID(), gr.getID());
-            members.add(u);
-            members.add(gr);
-        }
-        return members;
-    }
-
-    private static Map<String, String> createIdMap(int start, int end) {
-        Map<String, String> memberIds = Maps.newLinkedHashMap();
-        for (int i = start; i < end; i++) {
-            String memberId = "member" + i;
-            //TODO
-            memberIds.put(MembershipProvider.getContentID(memberId, false), memberId);
-        }
-        return memberIds;
-    }
-
-    private static void assertMembers(Group grp, Set<String> ms) throws RepositoryException {
-        Set<String> members = new HashSet<String>(ms);
-        Iterator<Authorizable> iter = grp.getMembers();
-        while (iter.hasNext()) {
-            Authorizable member = iter.next();
-            Assert.assertTrue("Group must have member", members.remove(member.getID()));
-        }
-        assertEquals("Group must have all members", 0, members.size());
-    }
-
-    private static void assertMemberList(@Nonnull Tree groupTree, int cntRefTrees, int cnt) {
-        Tree list = groupTree.getChild(REP_MEMBERS_LIST);
-        assertTrue(list.exists());
-        assertEquals(cntRefTrees, list.getChildrenCount(5));
-        for (Tree c : list.getChildren()) {
-            PropertyState repMembers = c.getProperty(REP_MEMBERS);
-            assertNotNull(repMembers);
-            assertTrue(SIZE_TH == repMembers.count() || cnt == repMembers.count());
-        }
-    }
-
-    private Tree getTree(@Nonnull Authorizable a) throws Exception {
-        return root.getTree(a.getPath());
-    }
 }
\ No newline at end of file

Copied: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipWriterTest.java (from r1785987, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipWriterTest.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipWriterTest.java&p1=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java&r1=1785987&r2=1786860&rev=1786860&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipProviderTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/MembershipWriterTest.java Tue Mar 14 09:25:47 2017
@@ -16,31 +16,23 @@
  */
 package org.apache.jackrabbit.oak.security.user;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import javax.annotation.Nonnull;
-import javax.jcr.RepositoryException;
 
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.User;
-import org.apache.jackrabbit.oak.AbstractSecurityTest;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
-import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.oak.util.TreeUtil;
-import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -50,75 +42,33 @@ import static junit.framework.Assert.ass
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
+
 /**
  * Tests large group and user graphs.
- * <ul>
- * <li>{@link #NUM_USERS} users</li>
- * <li>{@link #NUM_GROUPS} groups</li>
- * <li>1 group with all users</li>
- * <li>1 user with all groups</li>
- * </ul>
+
  *
  * @since OAK 1.0
  */
-public class MembershipProviderTest extends AbstractSecurityTest implements UserConstants {
+public class MembershipWriterTest extends MembershipBaseTest {
 
-    private static final int NUM_USERS = 1000;
-    private static final int NUM_GROUPS = 1000;
-    private static final int SIZE_TH = 10;
-
-    private UserManagerImpl userMgr;
-    private MembershipProvider mp;
-    private Set<String> testUsers = new HashSet<String>();
-    private Set<String> testGroups = new HashSet<String>();
+    private MembershipWriter writer;
 
     @Before
     public void before() throws Exception {
         super.before();
-        userMgr = new UserManagerImpl(root, namePathMapper, getSecurityProvider());
-        mp = userMgr.getMembershipProvider();
+        writer = new MembershipWriter();
         // set the threshold low for testing
-        mp.setMembershipSizeThreshold(SIZE_TH);
-    }
-
-    @After
-    public void after() throws Exception {
-        try {
-            for (String path : Iterables.concat(testUsers, testGroups)) {
-                Authorizable auth = userMgr.getAuthorizableByPath(path);
-                if (auth != null) {
-                    auth.remove();
-                }
-            }
-            root.commit();
-        } finally {
-            testUsers.clear();
-            testGroups.clear();
-            super.after();
-        }
+        writer.setMembershipSizeThreshold(SIZE_TH);
     }
 
-    @Test
-    public void testManyMembers() throws Exception {
-        Set<String> members = new HashSet<String>();
-        Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            members.add(usr.getID());
-        }
-        root.commit();
-        assertMembers(grp, members);
-
-        // also check storage structure
-        Tree tree = root.getTree(grp.getPath());
+    private static void assertContentStructure(@Nonnull Tree groupTree, int memberCnt) {
         assertEquals(
                 "rep:members property must have correct number of references",
                 SIZE_TH,
-                tree.getProperty(REP_MEMBERS).count()
+                groupTree.getProperty(REP_MEMBERS).count()
         );
 
-        Tree membersList = tree.getChild(REP_MEMBERS_LIST);
+        Tree membersList = groupTree.getChild(REP_MEMBERS_LIST);
         assertTrue(
                 "rep:memberList must exist",
                 membersList.exists()
@@ -132,88 +82,123 @@ public class MembershipProviderTest exte
 
         assertEquals(
                 "rep:memberList must have correct number of child nodes.",
-                (NUM_USERS / SIZE_TH) - 1,
+                (memberCnt / SIZE_TH) - 1,
                 membersList.getChildrenCount(Long.MAX_VALUE)
         );
     }
 
     @Test
-    public void testManyMemberships() throws Exception {
-        Set<String> memberships = new HashSet<String>();
-        User usr = createUser();
-        for (int i = 0; i < NUM_GROUPS; i++) {
-            Group grp = createGroup();
-            grp.addMember(usr);
-            memberships.add(grp.getID());
+    public void testAddMemberExceedThreshold() throws Exception {
+        Group grp = createGroup();
+        for (String contentId : createIdMap(0, NUM_USERS).keySet()) {
+            writer.addMember(getTree(grp), contentId);
         }
         root.commit();
 
-        Iterator<Group> iter = usr.declaredMemberOf();
-        while (iter.hasNext()) {
-            Group group = iter.next();
-            Assert.assertTrue(memberships.remove(group.getID()));
-        }
-        assertEquals(0, memberships.size());
+        // check storage structure
+        assertContentStructure(getTree(grp), NUM_USERS);
     }
 
     @Test
-    public void testNestedMembers() throws Exception {
-        Set<String> members = new HashSet<String>();
-        Set<String> declaredMembers = new HashSet<String>();
+    public void testAddMembersExceedThreshold() throws Exception {
         Group grp = createGroup();
-        for (int i = 0; i < 10; i++) {
-            Group g1 = createGroup();
-            grp.addMember(g1);
-            members.add(g1.getID());
-            declaredMembers.add(g1.getID());
-            for (int j = 0; j < 10; j++) {
-                Group g2 = createGroup();
-                g1.addMember(g2);
-                members.add(g2.getID());
-                for (int k = 0; k < 10; k++) {
-                    User usr = createUser();
-                    g2.addMember(usr);
-                    members.add(usr.getID());
-                }
-            }
-        }
+        Map idMap = createIdMap(0, NUM_USERS);
+        writer.addMembers(getTree(grp), idMap);
         root.commit();
 
-        assertMembers(grp, members);
+        // check storage structure
+        assertContentStructure(getTree(grp), NUM_USERS);
+    }
 
-        Iterator<Authorizable> iter = grp.getDeclaredMembers();
-        while (iter.hasNext()) {
-            Authorizable member = iter.next();
-            Assert.assertTrue(declaredMembers.remove(member.getID()));
-        }
-        assertEquals(0, declaredMembers.size());
+    @Test
+    public void testAddMembersExceedThreshold2() throws Exception {
+        Tree groupTree = getTree(createGroup());
+
+        // 1. add array of 21 memberIDs exceeding the threshold
+        Map<String, String> memberIds = createIdMap(0, 21);
+        writer.addMembers(groupTree, memberIds);
+
+        PropertyState repMembers = groupTree.getProperty(REP_MEMBERS);
+        assertNotNull(repMembers);
+        assertEquals(SIZE_TH, repMembers.count());
+
+        // the members-list must how have two ref-members nodes one with 10 and
+        // one with a single ref-value
+        assertMemberList(groupTree, 2, 1);
+
+        // 2. add more members without reaching threshold => still 2 ref-nodes
+        memberIds = createIdMap(21, 29);
+        writer.addMembers(groupTree, memberIds);
+        assertMemberList(groupTree, 2, 9);
+
+        // 3. fill up second ref-members node => a new one must be created
+        memberIds = createIdMap(29, 35);
+        writer.addMembers(groupTree, memberIds);
+        assertMemberList(groupTree, 3, 5);
+
+        // 4. remove members from the initial set => ref nodes as before, rep:members prop on group modified
+        memberIds.clear();
+        memberIds.put(getContentID("member1"), "member1");
+        memberIds.put(getContentID("member2"), "member2");
+        writer.removeMembers(groupTree, Maps.newHashMap(memberIds));
+
+        assertMemberList(groupTree, 3, 5);
+        assertEquals(8, groupTree.getProperty(REP_MEMBERS).count());
+
+        // 5. add members again => best-tree is the ref-member-node
+        memberIds = createIdMap(35, 39);
+        writer.addMembers(groupTree, memberIds);
+
+        assertEquals(8, groupTree.getProperty(REP_MEMBERS).count());
+        assertMemberList(groupTree, 3, 9);
+
+        // 6. adding more members will fill up rep:members again and create new ref-node
+        memberIds = createIdMap(39, 45);
+        writer.addMembers(groupTree, memberIds);
+
+        assertEquals(SIZE_TH, groupTree.getProperty(REP_MEMBERS).count());
+        assertEquals(4, groupTree.getChild(REP_MEMBERS_LIST).getChildrenCount(10));
     }
 
     @Test
-    public void testNestedMemberships() throws Exception {
-        Set<String> memberships = new HashSet<String>();
-        User user = createUser();
+    public void testAddMemberAgain() throws Exception {
         Group grp = createGroup();
-        memberships.add(grp.getID());
-        for (int i = 0; i < 10; i++) {
-            Group g1 = createGroup();
-            grp.addMember(g1);
-            memberships.add(g1.getID());
-            for (int j = 0; j < 10; j++) {
-                Group g2 = createGroup();
-                g1.addMember(g2);
-                memberships.add(g2.getID());
-                g2.addMember(user);
-            }
+        List<String> memberPaths = createMembers(grp, NUM_USERS);
+        root.commit();
+
+        Tree groupTree = getTree(grp);
+        for (String path : memberPaths) {
+            Tree memberTree = root.getTree(path);
+            String contentId = getContentID(memberTree);
+            assertFalse(writer.addMember(groupTree, contentId));
         }
+    }
+
+    @Test
+    public void testAddMembersAgain() throws Exception {
+        Group grp = createGroup();
+        List<String> memberPaths = createMembers(grp, NUM_USERS);
         root.commit();
 
-        Iterator<Group> iter = user.memberOf();
-        while (iter.hasNext()) {
-            Group group = iter.next();
-            Assert.assertTrue(memberships.remove(group.getID()));
+        Map<String, String> m = new HashMap();
+        for (String path : memberPaths) {
+            Tree memberTree = root.getTree(path);
+            String memberId = TreeUtil.getString(memberTree, REP_AUTHORIZABLE_ID);
+            m.put(getContentID(memberTree), memberId);
         }
-        assertEquals(0, memberships.size());
+
+        Set<String> expected = Sets.newHashSet(m.values());
+        Set<String> failed = writer.addMembers(getTree(grp), m);
+        assertFalse(failed.isEmpty());
+        assertEquals(expected, failed);
+    }
+
+    @Test
+    public void testAddFewMembers() throws Exception {
+        Group g = createGroup();
+        g.addMembers(createGroup().getID(), createUser().getID());
+
+        assertFalse(getTree(g).hasChild(REP_MEMBERS_LIST));
     }
 
     @Test
@@ -241,7 +226,7 @@ public class MembershipProviderTest exte
         assertMembers(grp, members);
 
         // also check storage structure
-        Tree tree = root.getTree(grp.getPath());
+        Tree tree = getTree(grp);
         assertNull(
                 "rep:members property not exist",
                 tree.getProperty(REP_MEMBERS)
@@ -291,313 +276,4 @@ public class MembershipProviderTest exte
         assertTrue("the first overflow node must not exist", membersList.getChild("1").exists()
         );
     }
-
-    @Test
-    public void testAddMembersAgain() throws Exception {
-        Set<String> members = new HashSet<String>();
-        Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            members.add(usr.getID());
-        }
-        root.commit();
-
-        for (String id : members) {
-            assertFalse(grp.addMember(userMgr.getAuthorizable(id)));
-        }
-    }
-
-    @Test
-    public void testAddMembersAgainOnMembershipProvider() throws Exception {
-        Set<String> memberPaths = new HashSet<String>();
-        Group grp = createGroup();
-        for (int i = 0; i < NUM_USERS; i++) {
-            User usr = createUser();
-            grp.addMember(usr);
-            memberPaths.add(usr.getPath());
-        }
-        root.commit();
-
-        Tree groupTree = root.getTree(grp.getPath());
-        for (String path : memberPaths) {
-            Tree memberTree = root.getTree(path);
-            assertFalse(mp.addMember(groupTree, memberTree));
-            assertFalse(mp.addMember(groupTree, memberTree));
-
-            String memberId = TreeUtil.getString(memberTree, REP_AUTHORIZABLE_ID);
-            Map<String, String> m = new HashMap<String, String>(1);
-            m.put(TreeUtil.getString(memberTree, JcrConstants.JCR_UUID), memberId);
-
-            Set<String> failed = mp.addMembers(groupTree, m);
-            assertFalse(failed.isEmpty());
-            assertTrue(failed.contains(memberId));
-        }
-    }
-
-    @Test
-    public void testIsDeclaredMemberTransient() throws Exception {
-        Group g = createGroup();
-        List<Authorizable> members = createMembers(g, NUM_USERS/2);
-
-        Tree groupTree = getTree(g);
-
-        // test declared members with transient modifications
-        for (Authorizable a : members) {
-            assertTrue(mp.isDeclaredMember(groupTree, getTree(a)));
-        }
-    }
-
-    @Test
-    public void testIsDeclaredMember() throws Exception {
-        Group g = createGroup();
-        List<Authorizable> members = createMembers(g, NUM_USERS/2);
-        root.commit();
-
-        Tree groupTree = getTree(g);
-
-        // test declared members after commit
-        for (Authorizable a : members) {
-            assertTrue(mp.isDeclaredMember(groupTree, getTree(a)));
-        }
-    }
-
-    @Test
-    public void testIsDeclaredMemberFew() throws Exception {
-        Group g = createGroup();
-        Group m1 = createGroup();
-        User m2 = createUser();
-
-        g.addMembers(m1.getID(), m2.getID());
-
-        Tree groupTree = getTree(g);
-        assertFalse(groupTree.hasChild(REP_MEMBERS_LIST));
-
-        // test declared members with transient modifications
-        assertTrue(mp.isDeclaredMember(groupTree, getTree(m1)));
-        assertTrue(mp.isDeclaredMember(groupTree, getTree(m2)));
-
-        // ... and after commit
-        root.commit();
-        assertTrue(mp.isDeclaredMember(groupTree, getTree(m1)));
-        assertTrue(mp.isDeclaredMember(groupTree, getTree(m2)));
-    }
-
-    @Test
-    public void testIsMemberTransient() throws Exception {
-        Group g = createGroup();
-        Group g2 = createGroup();
-        g.addMember(g2);
-
-        List<Authorizable> members = createMembers(g2, 50);
-
-        Tree groupTree = getTree(g);
-
-        // test members with transient modifications
-        for (Authorizable a : members) {
-            Tree tree = getTree(a);
-            assertFalse(mp.isDeclaredMember(groupTree, tree));
-            assertTrue(mp.isMember(groupTree, tree));
-        }
-    }
-
-    @Test
-    public void testIsMember() throws Exception {
-        Group g = createGroup();
-        Group g2 = createGroup();
-        g.addMember(g2);
-
-        List<Authorizable> members = createMembers(g2, NUM_USERS/2);
-        root.commit();
-
-        // test members after commit
-        Tree groupTree = getTree(g);
-        for (Authorizable a : members) {
-            Tree tree = getTree(a);
-            assertFalse(mp.isDeclaredMember(groupTree, tree));
-            assertTrue(mp.isMember(groupTree, tree));
-        }
-    }
-
-    @Test
-    public void testIsMemberFew() throws Exception {
-        Group g = createGroup();
-        Group g2 = createGroup();
-        g.addMember(g2);
-
-        User m1 = createUser();
-        Group m2 = createGroup();
-        g2.addMember(m1);
-        g2.addMember(m2);
-
-        Tree groupTree = getTree(g);
-
-        // test members with transient modifications
-        assertFalse(mp.isDeclaredMember(groupTree, getTree(m1)));
-        assertFalse(mp.isDeclaredMember(groupTree, getTree(m2)));
-        assertTrue(mp.isMember(groupTree, getTree(m1)));
-        assertTrue(mp.isMember(groupTree, getTree(m2)));
-
-        // ... and after commit
-        root.commit();
-        assertFalse(mp.isDeclaredMember(groupTree, getTree(m1)));
-        assertFalse(mp.isDeclaredMember(groupTree, getTree(m2)));
-        assertTrue(mp.isMember(groupTree, getTree(m1)));
-        assertTrue(mp.isMember(groupTree, getTree(m2)));
-    }
-
-    @Test
-    public void testTransientInMembersList() throws Exception {
-        Group g = createGroup();
-        createMembers(g, NUM_USERS/2);
-        root.commit();
-
-        // add another transient member that will end up in the members-ref-list
-        User u = createUser();
-        g.addMember(u);
-
-        Tree groupTree = getTree(g);
-        Tree memberTree = getTree(u);
-
-        assertTrue(mp.isDeclaredMember(groupTree, memberTree));
-        assertTrue(mp.isMember(groupTree, memberTree));
-
-        assertFalse(Iterators.contains(mp.getMembership(memberTree, false), groupTree.getPath()));
-        assertFalse(Iterators.contains(mp.getMembership(memberTree, true), groupTree.getPath()));
-        root.commit();
-        assertTrue(Iterators.contains(mp.getMembership(memberTree, false), groupTree.getPath()));
-        assertTrue(Iterators.contains(mp.getMembership(memberTree, true), groupTree.getPath()));
-    }
-
-    @Test
-    public void testNoMember() throws Exception {
-        Group g = createGroup();
-        Group notMember = createGroup();
-        User notMember2 = createUser();
-
-        assertFalse(g.isDeclaredMember(notMember));
-        assertFalse(g.isDeclaredMember(notMember2));
-
-        assertFalse(g.isMember(notMember));
-        assertFalse(g.isMember(notMember2));
-
-        root.commit();
-
-        assertFalse(g.isDeclaredMember(notMember));
-        assertFalse(g.isDeclaredMember(notMember2));
-
-        assertFalse(g.isMember(notMember));
-        assertFalse(g.isMember(notMember2));
-    }
-
-    @Test
-    public void testAddMembersExceedThreshold() throws Exception {
-        Tree groupTree = root.getTree(createGroup().getPath());
-
-        // 1. add array of 21 memberIDs exceeding the threshold
-        Map<String, String> memberIds = createIdMap(0, 21);
-        mp.addMembers(groupTree, memberIds);
-
-        PropertyState repMembers = groupTree.getProperty(REP_MEMBERS);
-        assertNotNull(repMembers);
-        assertEquals(SIZE_TH, repMembers.count());
-
-        // the members-list must how have two ref-members nodes one with 10 and
-        // one with a single ref-value
-        assertMemberList(groupTree, 2, 1);
-
-        // 2. add more members without reaching threshold => still 2 ref-nodes
-        memberIds = createIdMap(21, 29);
-        mp.addMembers(groupTree, memberIds);
-        assertMemberList(groupTree, 2, 9);
-
-        // 3. fill up second ref-members node => a new one must be created
-        memberIds = createIdMap(29, 35);
-        mp.addMembers(groupTree, memberIds);
-        assertMemberList(groupTree, 3, 5);
-
-        // 4. remove members from the initial set => ref nodes as before, rep:members prop on group modified
-        memberIds.clear();
-        memberIds.put(MembershipProvider.getContentID("member1", false), "member1");
-        memberIds.put(MembershipProvider.getContentID("member2", false), "member2");
-        mp.removeMembers(groupTree, Maps.newHashMap(memberIds));
-
-        assertMemberList(groupTree, 3, 5);
-        assertEquals(8, groupTree.getProperty(REP_MEMBERS).count());
-
-        // 5. add members again => best-tree is the ref-member-node
-        memberIds = createIdMap(35, 39);
-        mp.addMembers(groupTree, memberIds);
-
-        assertEquals(8, groupTree.getProperty(REP_MEMBERS).count());
-        assertMemberList(groupTree, 3, 9);
-
-        // 6. adding more members will fill up rep:members again and create new ref-node
-        memberIds = createIdMap(39, 45);
-        mp.addMembers(groupTree, memberIds);
-
-        assertEquals(SIZE_TH, groupTree.getProperty(REP_MEMBERS).count());
-        assertEquals(4, groupTree.getChild(REP_MEMBERS_LIST).getChildrenCount(10));
-    }
-
-    private User createUser() throws RepositoryException {
-        String userId = "testUser" + testUsers.size();
-        User usr = userMgr.createUser(userId, "pw");
-        testUsers.add(usr.getPath());
-        return usr;
-    }
-
-    private Group createGroup() throws RepositoryException {
-        String groupName = "testGroup" + testGroups.size();
-        Group grp = userMgr.createGroup(groupName);
-        testGroups.add(grp.getPath());
-        return grp;
-    }
-
-    private List<Authorizable> createMembers(@Nonnull Group g, int cnt) throws Exception {
-        List<Authorizable> members = new ArrayList();
-        for (int i = 0; i <= cnt; i++) {
-            User u = createUser();
-            Group gr = createGroup();
-            g.addMembers(u.getID(), gr.getID());
-            members.add(u);
-            members.add(gr);
-        }
-        return members;
-    }
-
-    private static Map<String, String> createIdMap(int start, int end) {
-        Map<String, String> memberIds = Maps.newLinkedHashMap();
-        for (int i = start; i < end; i++) {
-            String memberId = "member" + i;
-            //TODO
-            memberIds.put(MembershipProvider.getContentID(memberId, false), memberId);
-        }
-        return memberIds;
-    }
-
-    private static void assertMembers(Group grp, Set<String> ms) throws RepositoryException {
-        Set<String> members = new HashSet<String>(ms);
-        Iterator<Authorizable> iter = grp.getMembers();
-        while (iter.hasNext()) {
-            Authorizable member = iter.next();
-            Assert.assertTrue("Group must have member", members.remove(member.getID()));
-        }
-        assertEquals("Group must have all members", 0, members.size());
-    }
-
-    private static void assertMemberList(@Nonnull Tree groupTree, int cntRefTrees, int cnt) {
-        Tree list = groupTree.getChild(REP_MEMBERS_LIST);
-        assertTrue(list.exists());
-        assertEquals(cntRefTrees, list.getChildrenCount(5));
-        for (Tree c : list.getChildren()) {
-            PropertyState repMembers = c.getProperty(REP_MEMBERS);
-            assertNotNull(repMembers);
-            assertTrue(SIZE_TH == repMembers.count() || cnt == repMembers.count());
-        }
-    }
-
-    private Tree getTree(@Nonnull Authorizable a) throws Exception {
-        return root.getTree(a.getPath());
-    }
 }
\ No newline at end of file

Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserValidatorTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserValidatorTest.java?rev=1786860&r1=1786859&r2=1786860&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserValidatorTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserValidatorTest.java Tue Mar 14 09:25:47 2017
@@ -111,7 +111,7 @@ public class UserValidatorTest extends A
     public void createWithoutPrincipalName() throws Exception {
         try {
             User user = getUserManager(root).createUser("withoutPrincipalName", "pw");
-            Tree tree = root.getTree(userPath);
+            Tree tree = root.getTree(user.getPath());
             tree.removeProperty(REP_PRINCIPAL_NAME);
             root.commit();
 
@@ -127,7 +127,7 @@ public class UserValidatorTest extends A
     public void createWithInvalidUUID() throws Exception {
         try {
             User user = getUserManager(root).createUser("withInvalidUUID", "pw");
-            Tree tree = root.getTree(userPath);
+            Tree tree = root.getTree(user.getPath());
             tree.setProperty(JcrConstants.JCR_UUID, UUID.randomUUID().toString());
             root.commit();