Author: angela
Date: Thu Mar 10 18:08:59 2016
New Revision: 1734439

URL: http://svn.apache.org/viewvc?rev=1734439&view=rev
Log:
OAK-4118 :  Benchmarks for Membership Operations (wip)

Added:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java
      - copied, changed from r1734426, 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java
Removed:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java
Modified:
    
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java?rev=1734439&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMemberTest.java
 Thu Mar 10 18:08:59 2016
@@ -0,0 +1,97 @@
+/*
+ * 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.benchmark;
+
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.List;
+import javax.annotation.Nonnull;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.security.auth.Subject;
+
+import org.apache.jackrabbit.api.JackrabbitSession;
+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.api.security.user.UserManager;
+import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+
+/**
+ * Test the performance of adding a configured number of members to groups. The
+ * following parameters can be used to run the benchmark:
+ *
+ * - numberOfMembers : the number of members that should be added in the test 
run
+ *
+ * In contrast to {@link AddMembersTest}, this benchmark will always call
+ * {@link Group#addMember(Authorizable)}.
+ */
+public class AddMemberTest extends AddMembersTest {
+
+    private final List<String> userPaths;
+
+    public AddMemberTest(int numberOfMembers) {
+        super(numberOfMembers, 1, ImportBehavior.NAME_ABORT);
+        userPaths = new ArrayList<String>(numberOfMembers);
+    }
+
+    protected void createUsers(@Nonnull UserManager userManager) throws 
Exception {
+        for (int i = 0; i <= numberOfMembers; i++) {
+            String id = USER + i;
+            User u = userManager.createUser(id, null, new PrincipalImpl(id), 
REL_TEST_PATH);
+            userPaths.add(u.getPath());
+        }
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        Session s = null;
+        try {
+            // use system session login to avoid measuring the 
login-performance here
+            s = Subject.doAsPrivileged(SystemSubject.INSTANCE, new 
PrivilegedExceptionAction<Session>() {
+                @Override
+                public Session run() throws Exception {
+                    return getRepository().login(null, null);
+                }
+            }, null);
+            UserManager userManager = ((JackrabbitSession) s).getUserManager();
+            String groupId = GROUP + random.nextInt(GROUP_CNT);
+            Group g = userManager.getAuthorizable(groupId, Group.class);
+
+        } catch (RepositoryException e) {
+            System.out.println(e.getMessage());
+            if (s.hasPendingChanges()) {
+                s.refresh(false);
+            }
+        } finally {
+            if (s != null) {
+                s.logout();
+            }
+        }
+    }
+
+    @Override
+    protected void addMembers(@Nonnull UserManager userManager, @Nonnull Group 
group, @Nonnull Session s) throws Exception {
+        for (int i = 0; i <= numberOfMembers; i++) {
+            String userPath = userPaths.get(random.nextInt(numberOfMembers));
+            group.addMember(userManager.getAuthorizableByPath(userPath));
+            s.save();
+        }
+    }
+}

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java?rev=1734439&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/AddMembersTest.java
 Thu Mar 10 18:08:59 2016
@@ -0,0 +1,192 @@
+/*
+ * 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.benchmark;
+
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import javax.annotation.Nonnull;
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.security.auth.Subject;
+
+import org.apache.jackrabbit.api.JackrabbitSession;
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.UserManager;
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.fixture.JcrCreator;
+import org.apache.jackrabbit.oak.fixture.OakRepositoryFixture;
+import org.apache.jackrabbit.oak.fixture.RepositoryFixture;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
+import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
+import org.apache.jackrabbit.util.Text;
+
+/**
+ * Test the performance of adding a configured number of members to groups. The
+ * following parameters can be used to run the benchmark:
+ *
+ * - numberOfMembers : the number of members that should be added in the test 
run
+ * - batchSize : the size of the memberID-array to be passed to the addMembers 
call
+ * - importBehavior : the {@link 
org.apache.jackrabbit.oak.spi.xml.ImportBehavior}; valid options are 
"besteffort", "ignore" and "abort"
+ *
+ * An importbehavior of "ignore" and "abort" will required the members to exist
+ * and will resolve each ID to the corresponding authorizble first (different 
test
+ * setup). In case of "besteffort" the member is not resolved to an 
authorizable.
+ */
+public class AddMembersTest extends AbstractTest {
+
+    static final String REL_TEST_PATH = "testPath";
+    static final String USER = "user";
+    static final String GROUP = "group";
+    static final int GROUP_CNT = 100;
+    static final int DEFAULT_BATCH_SIZE = 1;
+
+    final Random random = new Random();
+    final int numberOfMembers;
+    private final int batchSize;
+    private final String importBehavior;
+
+    private final List<String> groupPaths = new ArrayList(GROUP_CNT);
+
+    public AddMembersTest(int numberOfMembers, int batchSize, @Nonnull String 
importBehavior) {
+        this.numberOfMembers = numberOfMembers;
+        this.batchSize = batchSize;
+        this.importBehavior = importBehavior;
+    }
+
+    @Override
+    public void beforeSuite() throws Exception {
+        super.beforeSuite();
+
+        Session s = loginAdministrative();
+        try {
+            UserManager userManager = ((JackrabbitSession) s).getUserManager();
+            for (int i = 0; i <= GROUP_CNT; i++) {
+                Group g = userManager.createGroup(new PrincipalImpl(GROUP + 
i), REL_TEST_PATH);
+                groupPaths.add(g.getPath());
+            }
+
+            createUsers(userManager);
+
+        } finally {
+            s.save();
+            s.logout();
+        }
+        System.out.println("setup done");
+    }
+
+    protected void createUsers(@Nonnull UserManager userManager) throws 
Exception {
+        if (!ImportBehavior.NAME_BESTEFFORT.equals(importBehavior)) {
+            for (int i = 0; i <= numberOfMembers; i++) {
+                String id = USER + i;
+                userManager.createUser(id, null, new PrincipalImpl(id), 
REL_TEST_PATH);
+            }
+        }
+    }
+
+    @Override
+    public void afterSuite() throws Exception {
+        Session s = loginAdministrative();
+        try {
+            Authorizable authorizable = ((JackrabbitSession) 
s).getUserManager().getAuthorizable(GROUP + "0");
+            if (authorizable != null) {
+                Node n = 
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+                n.remove();
+            }
+
+            if (!ImportBehavior.NAME_BESTEFFORT.equals(importBehavior)) {
+                authorizable = ((JackrabbitSession) 
s).getUserManager().getAuthorizable(USER + "0");
+                if (authorizable != null) {
+                    Node n = 
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+                    n.remove();
+                }
+            }
+            s.save();
+        } finally {
+            s.logout();
+        }
+    }
+
+    @Override
+    protected Repository[] createRepository(RepositoryFixture fixture) throws 
Exception {
+        if (fixture instanceof OakRepositoryFixture) {
+            return ((OakRepositoryFixture) fixture).setUpCluster(1, new 
JcrCreator() {
+                @Override
+                public Jcr customize(Oak oak) {
+                    SecurityProvider sp = new 
SecurityProviderImpl(ConfigurationParameters.of(UserConfiguration.NAME, 
ConfigurationParameters.of(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR, 
importBehavior)));
+                    return new Jcr(oak).with(sp);
+                }
+            });
+        } else {
+            return super.createRepository(fixture);
+        }
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        Session s = null;
+        try {
+            // use system session login to avoid measuring the 
login-performance here
+            s = Subject.doAsPrivileged(SystemSubject.INSTANCE, new 
PrivilegedExceptionAction<Session>() {
+                @Override
+                public Session run() throws Exception {
+                    return getRepository().login(null, null);
+                }
+            }, null);
+            UserManager userManager = ((JackrabbitSession) s).getUserManager();
+            String groupPath = groupPaths.get(random.nextInt(GROUP_CNT));
+            Group g = (Group) userManager.getAuthorizableByPath(groupPath);
+            addMembers(userManager, g, s);
+        } catch (RepositoryException e) {
+            System.out.println(e.getMessage());
+            if (s.hasPendingChanges()) {
+                s.refresh(false);
+            }
+        } finally {
+            if (s != null) {
+                s.logout();
+            }
+        }
+    }
+
+    protected void addMembers(@Nonnull UserManager userManger, @Nonnull Group 
group, @Nonnull Session s) throws Exception {
+        for (int i = 0; i <= numberOfMembers; i++) {
+            if (batchSize <= DEFAULT_BATCH_SIZE) {
+                group.addMembers(USER + i);
+            } else {
+                String[] ids = new String[batchSize];
+                for (int j = 0; j < batchSize && i <= numberOfMembers; j++) {
+                    ids[j] = USER + i;
+                    i++;
+                }
+                group.addMembers(ids);
+            }
+            s.save();
+        }
+    }
+}

Modified: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1734439&r1=1734438&r2=1734439&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 Thu Mar 10 18:08:59 2016
@@ -101,7 +101,7 @@ public class BenchmarkRunner {
         OptionSpec<Boolean> nestedGroups = parser.accepts("nestedGroups", "Use 
nested groups.")
                         
.withOptionalArg().ofType(Boolean.class).defaultsTo(false);
         OptionSpec<Integer> batchSize = parser.accepts("batchSize", "Batch 
size before persisting operations.")
-                
.withOptionalArg().ofType(Integer.class).defaultsTo(ManyGroupMembersTest.DEFAULT_BATCH_SIZE);
+                
.withOptionalArg().ofType(Integer.class).defaultsTo(AddMembersTest.DEFAULT_BATCH_SIZE);
         OptionSpec<String> importBehavior = parser.accepts("importBehavior", 
"Protected Item Import Behavior")
                                 
.withOptionalArg().ofType(String.class).defaultsTo(ImportBehavior.NAME_BESTEFFORT);
         OptionSpec<Integer> itemsToRead = parser.accepts("itemsToRead", 
"Number of items to read")
@@ -320,10 +320,41 @@ public class BenchmarkRunner {
             new GetGroupPrincipalsTest(
                     numberOfGroups.value(options),
                     nestedGroups.value(options)),
-            new ManyGroupMembersTest(
+
+            // benchmarks adding multiple or single members
+            new AddMembersTest(
                     numberOfUsers.value(options),
                     batchSize.value(options),
                     importBehavior.value(options)),
+            new AddMemberTest(
+                    numberOfUsers.value(options)),
+
+            // benchmark testing isMember/isDeclared member; each user only 
being member of 1 group
+            new IsMemberTest(
+                    numberOfUsers.value(options),
+                    nestedGroups.value(options)),
+            new IsDeclaredMemberTest(
+                    numberOfUsers.value(options),
+                    nestedGroups.value(options)),
+
+            // 4 benchmarks with the same setup test various membership 
operations.
+            new MemberDeclaredMemberOf(
+                    numberOfGroups.value(options),
+                    nestedGroups.value(options),
+                    numberOfUsers.value(options)),
+            new MemberMemberOf(
+                    numberOfGroups.value(options),
+                    nestedGroups.value(options),
+                    numberOfUsers.value(options)),
+            new MemberIsDeclaredMember(
+                    numberOfGroups.value(options),
+                    nestedGroups.value(options),
+                    numberOfUsers.value(options)),
+            new MemberIsMember(
+                    numberOfGroups.value(options),
+                    nestedGroups.value(options),
+                    numberOfUsers.value(options)),
+
             new FullTextSearchTest(
                     wikipedia.value(options),
                     flatStructure.value(options),

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java?rev=1734439&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsDeclaredMemberTest.java
 Thu Mar 10 18:08:59 2016
@@ -0,0 +1,37 @@
+/*
+ * 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.benchmark;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+
+/**
+ * Same as {@link IsMemberTest} but the test run will check for the randomly 
selected
+ * user to be a declared member of the target group.
+ */
+public class IsDeclaredMemberTest extends IsMemberTest {
+
+    public IsDeclaredMemberTest(int numberOfUsers, boolean nestedGroups) {
+        super(numberOfUsers, nestedGroups);
+    }
+
+    protected boolean isMember(Group g, Authorizable member) throws 
RepositoryException {
+        return g.isDeclaredMember(member);
+    }
+}

Copied: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java
 (from r1734426, 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java)
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java?p2=jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java&p1=jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java&r1=1734426&r2=1734439&rev=1734439&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/ManyGroupMembersTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/IsMemberTest.java
 Thu Mar 10 18:08:59 2016
@@ -20,8 +20,6 @@ import java.security.PrivilegedException
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
-import javax.annotation.Nonnull;
-import javax.jcr.Credentials;
 import javax.jcr.Node;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
@@ -31,6 +29,7 @@ import javax.security.auth.Subject;
 import org.apache.jackrabbit.api.JackrabbitSession;
 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.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.Oak;
 import org.apache.jackrabbit.oak.fixture.JcrCreator;
@@ -48,58 +47,68 @@ import org.apache.jackrabbit.oak.spi.xml
 import org.apache.jackrabbit.util.Text;
 
 /**
- * Test the performance of adding a configured number of members to groups. The
- * following parameters can be used to run the benchmark:
+ * Benchmark for {@link Group#isMember(Authorizable)} with the following setup:
+ * - 10 groups
+ * - boolean flag defining if the 10 groups will be nested or not.
+ * - configurable number of users that will be added as members.
  *
- * - numberOfMembers : the number of members that should be added in the test 
run
- * - batchSize : the number of members that should be added before calling 
Session.save
- * - importBehavior : the {@link 
org.apache.jackrabbit.oak.spi.xml.ImportBehavior}; valid options are 
"besteffort", "ignore" and "abort"
+ * The test setup adds the configured number of users as members to the 10 
groups,
+ * where the target group is picked randomly. But note that each user is only
+ * member of one single group!
  *
- * For simplicity this benchmark makes use of {@link 
Group#addMembers(String...)}.
- * An importbehavior of "ignore" and "abort" will required the members to exist
- * and will resolve each ID to the corresponding authorizble first. Those are
- * consequently almost equivalent to calling {@link 
Group#addMember(org.apache.jackrabbit.api.security.user.Authorizable)}.
- * In case of "besteffort" the member is not resolved to an authorizable.
+ * The test run picks random users and tests for being member of a randomly
+ * selected group.
  */
-public class ManyGroupMembersTest extends AbstractTest {
+public class IsMemberTest extends AbstractTest {
 
     private final Random random = new Random();
 
     private static final String REL_TEST_PATH = "testPath";
+
     private static final String USER = "user";
     private static final String GROUP = "group";
-    private static final int GROUP_CNT = 100;
+    private static final int GROUP_CNT = 10;
+
+    private final int numberOfUsers;
+    private final boolean nestedGroups;
 
-    static final int DEFAULT_BATCH_SIZE = 1;
+    private List<String> gPaths = new ArrayList<String>();
+    private List<String> uPaths = new ArrayList<String>();
 
-    private final int numberOfMembers;
-    private final int batchSize;
-    private final String importBehavior;
-
-    public ManyGroupMembersTest(int numberOfMembers, int batchSize, @Nonnull 
String importBehavior) {
-        this.numberOfMembers = numberOfMembers;
-        this.batchSize = batchSize;
-        this.importBehavior = importBehavior;
+    public IsMemberTest(int numberOfUsers, boolean nestedGroups) {
+        this.numberOfUsers = numberOfUsers;
+        this.nestedGroups = nestedGroups;
     }
 
     @Override
-    public void setUp(Repository repository, Credentials credentials) throws 
Exception {
-        super.setUp(repository, credentials);
+    protected void beforeSuite() throws Exception {
+        super.beforeSuite();
 
         Session s = loginAdministrative();
         try {
             UserManager userManager = ((JackrabbitSession) s).getUserManager();
-            for (int i = 0; i <= GROUP_CNT; i++) {
-                userManager.createGroup(new PrincipalImpl(GROUP + i), 
REL_TEST_PATH);
+            Group gr = userManager.createGroup(new PrincipalImpl(GROUP + 0), 
REL_TEST_PATH);
+            gPaths.add(gr.getPath());
+            for (int i = 1; i < GROUP_CNT; i++) {
+                Group g = userManager.createGroup(new PrincipalImpl(GROUP + 
i), REL_TEST_PATH);
+                if (nestedGroups) {
+                    g.addMember(gr);
+                }
+                gr = g;
+                gPaths.add(gr.getPath());
             }
 
-            if (!ImportBehavior.NAME_BESTEFFORT.equals(importBehavior)) {
-                for (int i = 0; i <= numberOfMembers; i++) {
-                    String id = USER + i;
-                    userManager.createUser(id, null, new PrincipalImpl(id), 
REL_TEST_PATH);
+            int cnt = 0;
+            for (int i = 0; i <= numberOfUsers; i++) {
+                User u = userManager.createUser(USER + i, null, new 
PrincipalImpl(USER + i), REL_TEST_PATH);
+                uPaths.add(u.getPath());
+
+                getRandomGroup(userManager).addMember(u);
+
+                if (++cnt == 20000) {
+                    s.save();
                 }
             }
-
         } finally {
             s.save();
             s.logout();
@@ -108,28 +117,22 @@ public class ManyGroupMembersTest extend
     }
 
     @Override
-    public void tearDown() throws Exception {
+    public void afterSuite() throws Exception {
+        Session s = loginAdministrative();
         try {
-            Session s = loginAdministrative();
-
             Authorizable authorizable = ((JackrabbitSession) 
s).getUserManager().getAuthorizable(GROUP + "0");
             if (authorizable != null) {
                 Node n = 
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
                 n.remove();
             }
-
-            if (!ImportBehavior.NAME_BESTEFFORT.equals(importBehavior)) {
-                authorizable = ((JackrabbitSession) 
s).getUserManager().getAuthorizable(USER + "0");
-                if (authorizable != null) {
-                    Node n = 
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
-                    n.remove();
-                }
+            authorizable = ((JackrabbitSession) 
s).getUserManager().getAuthorizable(USER + "0");
+            if (authorizable != null) {
+                Node n = 
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+                n.remove();
             }
             s.save();
-            s.logout();
-
         } finally {
-            super.tearDown();
+            s.logout();
         }
     }
 
@@ -139,7 +142,7 @@ public class ManyGroupMembersTest extend
             return ((OakRepositoryFixture) fixture).setUpCluster(1, new 
JcrCreator() {
                 @Override
                 public Jcr customize(Oak oak) {
-                    SecurityProvider sp = new 
SecurityProviderImpl(ConfigurationParameters.of(UserConfiguration.NAME, 
ConfigurationParameters.of(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR, 
importBehavior)));
+                    SecurityProvider sp = new 
SecurityProviderImpl(ConfigurationParameters.of(UserConfiguration.NAME, 
ConfigurationParameters.of(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR, 
ImportBehavior.NAME_BESTEFFORT)));
                     return new Jcr(oak).with(sp);
                 }
             });
@@ -160,30 +163,30 @@ public class ManyGroupMembersTest extend
                 }
             }, null);
             UserManager userManager = ((JackrabbitSession) s).getUserManager();
-            String groupId = GROUP + random.nextInt(GROUP_CNT);
-            Group g = userManager.getAuthorizable(groupId, Group.class);
-            for (int i = 0; i <= numberOfMembers; i++) {
-                if (batchSize <= DEFAULT_BATCH_SIZE) {
-                    g.addMembers(USER + i);
-                } else {
-                    List<String> ids = new ArrayList<String>(batchSize);
-                    for (int j = 0; j < batchSize && i <= numberOfMembers; 
j++) {
-                        ids.add(USER + i);
-                        i++;
-                    }
-                    g.addMembers(ids.toArray(new String[ids.size()]));
-                }
-                s.save();
+
+            for (int i = 0; i <= 1000; i++) {
+                Group g = getRandomGroup(userManager);
+                boolean isMember = isMember(g, getRandomUser(userManager));
+                //System.out.println(USER + i + " is " + (isMember? "" : "not 
")+ "member of " +groupId);
             }
         } catch (RepositoryException e) {
             System.out.println(e.getMessage());
-            if (s.hasPendingChanges()) {
-                s.refresh(false);
-            }
         } finally {
             if (s != null) {
                 s.logout();
             }
         }
     }
+
+    protected boolean isMember(Group g, Authorizable member) throws 
RepositoryException {
+        return g.isMember(member);
+    }
+
+    private Group getRandomGroup(UserManager uMgr) throws RepositoryException {
+        return (Group) 
uMgr.getAuthorizableByPath(gPaths.get(random.nextInt(GROUP_CNT)));
+    }
+
+    private User getRandomUser(UserManager uMgr) throws RepositoryException {
+        return (User) 
uMgr.getAuthorizableByPath(uPaths.get(random.nextInt(numberOfUsers)));
+    }
 }

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java?rev=1734439&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberBaseTest.java
 Thu Mar 10 18:08:59 2016
@@ -0,0 +1,184 @@
+/*
+ * 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.benchmark;
+
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import javax.annotation.Nonnull;
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.security.auth.Subject;
+
+import com.google.common.collect.ObjectArrays;
+import org.apache.jackrabbit.api.JackrabbitSession;
+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.api.security.user.UserManager;
+import org.apache.jackrabbit.oak.Oak;
+import org.apache.jackrabbit.oak.fixture.JcrCreator;
+import org.apache.jackrabbit.oak.fixture.OakRepositoryFixture;
+import org.apache.jackrabbit.oak.fixture.RepositoryFixture;
+import org.apache.jackrabbit.oak.jcr.Jcr;
+import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import org.apache.jackrabbit.oak.spi.security.authentication.SystemSubject;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
+import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
+import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
+import org.apache.jackrabbit.util.Text;
+
+/**
+ * Abstract test-base for the various membership related operations (isMember, 
isDeclaredMember, memberOf, declaredMemberOf)
+ * with the following characteristics an config options:
+ *
+ * - 'numberOfGroups' : number of groups, which each member will become member 
of
+ * - 'nested' : flag to enforce nesting of groups; in effect each group will 
then become member of the previous group
+ * - 'numberOfMembers' : number of users to be created and which will become 
member of all groups
+ *
+ * The test run randomly picks one group and one user and performs the
+ * member-operation as defined by the subclasses (see 'testMembership')
+ */
+abstract class MemberBaseTest extends AbstractTest {
+
+    private static final int BATCH_SIZE = 100;
+    private static final String REL_TEST_PATH = "testPath";
+    private static final String USER = "user";
+    private static final String GROUP = "group";
+
+    private final Random random = new Random();
+
+    private final int numberOfGroups;
+    private final int numberOfMembers;
+    private final boolean nested;
+
+    private final List<String> groupPaths;
+    private final List<String> memberPaths;
+
+    public MemberBaseTest(int numberOfGroups, boolean nested, int 
numberOfMembers) {
+        this.numberOfGroups = numberOfGroups;
+        this.numberOfMembers = numberOfMembers;
+        this.nested = nested;
+
+        groupPaths = new ArrayList<String>(numberOfGroups);
+        memberPaths = new ArrayList<String>(numberOfMembers);
+    }
+
+    @Override
+    public void beforeSuite() throws Exception {
+        super.beforeSuite();
+
+        Session s = loginAdministrative();
+        try {
+            List<String> memberIds = new ArrayList<String>(numberOfMembers);
+            UserManager userManager = ((JackrabbitSession) s).getUserManager();
+            for (int i = 0; i <= numberOfMembers; i++) {
+                User u = userManager.createUser(USER + i, null, new 
PrincipalImpl(USER + i), REL_TEST_PATH);
+                memberPaths.add(u.getPath());
+                memberIds.add(USER + i);
+            }
+
+            String[] idArray = memberIds.toArray(new String[memberIds.size()]);
+            for (int i = 0, j = 1; i <= numberOfGroups; i++, j++) {
+                Group g = userManager.createGroup(new PrincipalImpl(GROUP + 
i), REL_TEST_PATH);
+                groupPaths.add(g.getPath());
+
+                if (nested) {
+                    g.addMembers(ObjectArrays.concat(idArray, GROUP + j));
+                } else {
+                    g.addMembers(idArray);
+                }
+            }
+        } finally {
+            s.save();
+            s.logout();
+        }
+        System.out.println("setup done");
+    }
+
+    @Override
+    public void afterSuite() throws Exception {
+        Session s = loginAdministrative();
+        try {
+            Authorizable authorizable = ((JackrabbitSession) 
s).getUserManager().getAuthorizable(GROUP + "0");
+            if (authorizable != null) {
+                Node n = 
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+                n.remove();
+            }
+
+            authorizable = ((JackrabbitSession) 
s).getUserManager().getAuthorizable(USER + "0");
+            if (authorizable != null) {
+                Node n = 
s.getNode(Text.getRelativeParent(authorizable.getPath(), 1));
+                n.remove();
+            }
+            s.save();
+        } finally {
+            s.logout();
+        }
+    }
+
+    @Override
+    public void runTest() throws Exception {
+        Session s = null;
+        try {
+            // use system session login to avoid measuring the 
login-performance here
+            s = Subject.doAsPrivileged(SystemSubject.INSTANCE, new 
PrivilegedExceptionAction<Session>() {
+                @Override
+                public Session run() throws Exception {
+                    return getRepository().login(null, null);
+                }
+            }, null);
+
+            UserManager uMgr = ((JackrabbitSession) s).getUserManager();
+            for (int i = 0; i <= 1000; i++) {
+                testMembership(
+                        (Group) 
uMgr.getAuthorizableByPath(groupPaths.get(random.nextInt(numberOfGroups))),
+                        (User) 
uMgr.getAuthorizableByPath(memberPaths.get(random.nextInt(numberOfMembers))));
+            }
+        } catch (RepositoryException e) {
+            System.out.println(e.getMessage());
+        } finally {
+            if (s != null) {
+                s.logout();
+            }
+        }
+    }
+
+    @Override
+    protected Repository[] createRepository(RepositoryFixture fixture) throws 
Exception {
+        if (fixture instanceof OakRepositoryFixture) {
+            return ((OakRepositoryFixture) fixture).setUpCluster(1, new 
JcrCreator() {
+                @Override
+                public Jcr customize(Oak oak) {
+                    SecurityProvider sp = new 
SecurityProviderImpl(ConfigurationParameters.of(UserConfiguration.NAME,
+                            
ConfigurationParameters.of(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR, 
ImportBehavior.NAME_BESTEFFORT)));
+                    return new Jcr(oak).with(sp);
+                }
+            });
+        } else {
+            return super.createRepository(fixture);
+        }
+    }
+
+    protected abstract void testMembership(@Nonnull Group g, @Nonnull User 
member) throws Exception;
+}
\ No newline at end of file

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java?rev=1734439&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberDeclaredMemberOf.java
 Thu Mar 10 18:08:59 2016
@@ -0,0 +1,37 @@
+/*
+ * 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.benchmark;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Same as {@link MemberBaseTest} but only reading the declared membership.
+ */
+public class MemberDeclaredMemberOf extends MemberBaseTest {
+
+    public MemberDeclaredMemberOf(int numberOfGroups, boolean nested, int 
numberOfMembers) {
+        super(numberOfGroups, nested, numberOfMembers);
+    }
+
+    @Override
+    protected void testMembership(@Nonnull Group g, @Nonnull User member) 
throws Exception {
+        member.declaredMemberOf();
+    }
+}
\ No newline at end of file

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java?rev=1734439&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsDeclaredMember.java
 Thu Mar 10 18:08:59 2016
@@ -0,0 +1,38 @@
+/*
+ * 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.benchmark;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Same as {@link MemberBaseTest} but testing {@link 
Group#isDeclaredMember(Authorizable)}.
+ */
+public class MemberIsDeclaredMember extends MemberBaseTest {
+
+    public MemberIsDeclaredMember(int numberOfGroups, boolean nested, int 
numberOfMembers) {
+        super(numberOfGroups, nested, numberOfMembers);
+    }
+
+    @Override
+    protected void testMembership(@Nonnull Group g, @Nonnull User member) 
throws Exception {
+        g.isDeclaredMember(member);
+    }
+}
\ No newline at end of file

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java?rev=1734439&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberIsMember.java
 Thu Mar 10 18:08:59 2016
@@ -0,0 +1,38 @@
+/*
+ * 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.benchmark;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.api.security.user.Authorizable;
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Same as {@link MemberBaseTest} but testing {@link 
Group#isMember(Authorizable)}.
+ */
+public class MemberIsMember extends MemberBaseTest {
+
+    public MemberIsMember(int numberOfGroups, boolean nested, int 
numberOfMembers) {
+        super(numberOfGroups, nested, numberOfMembers);
+    }
+
+    @Override
+    protected void testMembership(@Nonnull Group g, @Nonnull User member) 
throws Exception {
+        g.isMember(member);
+    }
+}
\ No newline at end of file

Added: 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java?rev=1734439&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/benchmark/MemberMemberOf.java
 Thu Mar 10 18:08:59 2016
@@ -0,0 +1,37 @@
+/*
+ * 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.benchmark;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.api.security.user.Group;
+import org.apache.jackrabbit.api.security.user.User;
+
+/**
+ * Same as {@link MemberBaseTest} but only reading the declared membership.
+ */
+public class MemberMemberOf extends MemberBaseTest {
+
+    public MemberMemberOf(int numberOfGroups, boolean nested, int 
numberOfMembers) {
+        super(numberOfGroups, nested, numberOfMembers);
+    }
+
+    @Override
+    protected void testMembership(@Nonnull Group g, @Nonnull User member) 
throws Exception {
+        member.memberOf();
+    }
+}
\ No newline at end of file



Reply via email to