This is an automated email from the ASF dual-hosted git repository.

angela pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new f7e3023516 OAK-10362: Create benchmark test (subtask of Improve 
AutoMembershipPrincipals#isInheritedMember)
f7e3023516 is described below

commit f7e3023516f453262e29a13fd8e10390918a4b88
Author: angela <[email protected]>
AuthorDate: Thu Jul 20 17:48:53 2023 +0200

    OAK-10362: Create benchmark test (subtask of Improve 
AutoMembershipPrincipals#isInheritedMember)
---
 .../jackrabbit/oak/benchmark/BenchmarkRunner.java  |   3 +
 .../external/AbstractExternalTest.java             |  31 ++++-
 .../external/AutoMembershipTest.java               | 153 +++++++++++++++++++++
 3 files changed, 180 insertions(+), 7 deletions(-)

diff --git 
a/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
 
b/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
index fe9b8b621a..8dd12210f4 100644
--- 
a/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
+++ 
b/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
@@ -28,6 +28,7 @@ import 
org.apache.jackrabbit.guava.common.util.concurrent.MoreExecutors;
 import joptsimple.OptionParser;
 import joptsimple.OptionSet;
 import org.apache.commons.io.FileUtils;
+import 
org.apache.jackrabbit.oak.benchmark.authentication.external.AutoMembershipTest;
 import 
org.apache.jackrabbit.oak.benchmark.authentication.external.ExternalLoginTest;
 import 
org.apache.jackrabbit.oak.benchmark.authentication.external.ListIdentitiesTest;
 import 
org.apache.jackrabbit.oak.benchmark.authentication.external.PrincipalNameResolutionTest;
@@ -456,6 +457,8 @@ public class BenchmarkRunner {
                                 
benchmarkOptions.getNumberOfGroups().value(options), 
benchmarkOptions.getExpiration().value(options),
                                 
benchmarkOptions.getRoundtripDelay().value(options)),
                         new 
ListIdentitiesTest(benchmarkOptions.getNumberOfUsers().value(options)),
+                        new 
AutoMembershipTest(benchmarkOptions.getNumberOfUsers().value(options), 
benchmarkOptions.getNumberOfGroups().value(options),
+                                
benchmarkOptions.getDynamicMembership().value(options), 
benchmarkOptions.getAutoMembership().values(options)),
                         new BundlingNodeTest(),
                         new PersistentCacheTest(statsProvider),
                         new StringWriteTest(),
diff --git 
a/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java
 
b/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java
index 8859f285b0..6bf4ccd662 100644
--- 
a/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java
+++ 
b/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AbstractExternalTest.java
@@ -41,7 +41,9 @@ 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.osgi.OsgiWhiteboard;
 import org.apache.jackrabbit.oak.security.internal.SecurityProviderBuilder;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalGroup;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentity;
@@ -63,6 +65,7 @@ import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.princ
 import 
org.apache.jackrabbit.oak.spi.security.principal.CompositePrincipalConfiguration;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalConfiguration;
 import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
@@ -127,10 +130,18 @@ abstract class AbstractExternalTest extends 
AbstractTest<RepositoryFixture> {
                 .setExpirationTime(expTime).setPathPrefix(PATH_PREFIX);
         syncConfig.group()
                 .setExpirationTime(expTime).setPathPrefix(PATH_PREFIX);
-
+        expandSyncConfig();
     }
 
     protected abstract Configuration createConfiguration();
+    
+    protected ConfigurationParameters getSecurityConfiguration() {
+        return ConfigurationParameters.EMPTY;
+    }
+    
+    protected void expandSyncConfig() {
+        // nop
+    }
 
     protected ContentRepository getContentRepository() {
         checkState(contentRepository != null);
@@ -194,8 +205,10 @@ abstract class AbstractExternalTest extends 
AbstractTest<RepositoryFixture> {
             return ((OakRepositoryFixture) fixture).setUpCluster(1, new 
JcrCreator() {
                 @Override
                 public Jcr customize(Oak oak) {
-                    Whiteboard whiteboard = oak.getWhiteboard();
-
+                    OsgiContextImpl context = new OsgiContextImpl();
+                    Whiteboard whiteboard = new 
OsgiWhiteboard(context.bundleContext());
+                    oak.with(whiteboard);
+                    
                     syncManager = new SyncManagerImpl(whiteboard);
                     whiteboard.register(SyncManager.class, syncManager, 
Collections.emptyMap());
 
@@ -207,7 +220,11 @@ abstract class AbstractExternalTest extends 
AbstractTest<RepositoryFixture> {
 
                     // assert proper init of the 
'externalPrincipalConfiguration' if dynamic membership is enabled
                     if (syncConfig.user().getDynamicMembership()) {
-                        OsgiContextImpl context = new OsgiContextImpl();
+                        
+                        // register the userconfiguration in order to have the 
dynamicmembership provider registered in 
+                        // the activate method
+                        UserConfiguration uc = 
securityProvider.getConfiguration(UserConfiguration.class);
+                        context.registerInjectActivateService(uc);
 
                         // register the ExternalPrincipal configuration in 
order to have it's
                         // activate method invoked.
@@ -235,10 +252,10 @@ abstract class AbstractExternalTest extends 
AbstractTest<RepositoryFixture> {
         }
     }
 
-    private static SecurityProvider newTestSecurityProvider(
+    private SecurityProvider newTestSecurityProvider(
             ExternalPrincipalConfiguration externalPrincipalConfiguration) {
-        SecurityProvider delegate = 
SecurityProviderBuilder.newBuilder().build();
-
+        SecurityProvider delegate = 
SecurityProviderBuilder.newBuilder().with(getSecurityConfiguration()).build();
+    
         PrincipalConfiguration principalConfiguration = 
delegate.getConfiguration(PrincipalConfiguration.class);
         if (!(principalConfiguration instanceof 
CompositePrincipalConfiguration)) {
             throw new IllegalStateException();
diff --git 
a/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AutoMembershipTest.java
 
b/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AutoMembershipTest.java
new file mode 100644
index 0000000000..2b095ff226
--- /dev/null
+++ 
b/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authentication/external/AutoMembershipTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.authentication.external;
+
+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.guava.common.collect.ImmutableMap;
+import 
org.apache.jackrabbit.oak.security.authentication.token.TokenLoginModule;
+import org.apache.jackrabbit.oak.security.authentication.user.LoginModuleImpl;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.authentication.GuestLoginModule;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.SyncContext;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncContext;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.DynamicSyncContext;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModule;
+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.jetbrains.annotations.NotNull;
+
+import javax.jcr.Session;
+import javax.jcr.ValueFactory;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static 
javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL;
+import static 
javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT;
+
+public class AutoMembershipTest extends AbstractExternalTest {
+    
+    private final boolean dynamicSync;
+    private final int numberOfUsers;
+
+    public AutoMembershipTest(int numberOfUsers, int numberOfGroups, boolean 
dynamicMembership, @NotNull List<String> autoMembership) {
+        super(numberOfUsers, numberOfGroups, Long.MAX_VALUE, 
dynamicMembership, autoMembership);
+        this.dynamicSync = dynamicMembership;
+        this.numberOfUsers = numberOfUsers;
+    }
+
+    @Override
+    protected void expandSyncConfig() {
+        super.expandSyncConfig();
+        
syncConfig.group().setDynamicGroups(syncConfig.user().getDynamicMembership());
+    }
+    
+    @Override
+    protected void beforeSuite() throws Exception {
+        super.beforeSuite();
+
+        Session systemSession = null;
+        try {
+            systemSession = systemLogin();
+            UserManager userManager = ((JackrabbitSession) 
systemSession).getUserManager();
+            ValueFactory valueFactory = systemSession.getValueFactory();
+
+            Set<String> memberIds = new HashSet<>();
+            SyncContext ctx = (dynamicSync) ? new 
DynamicSyncContext(syncConfig, idp, userManager, valueFactory) :
+                    new DefaultSyncContext(syncConfig, idp, userManager, 
valueFactory);
+            for (int i = 0; i < numberOfUsers; i++) {
+                String uid = "u" + i;
+                ctx.sync(idp.getUser(uid));
+                memberIds.add(uid);
+            }
+
+            // create a test group and extra nested groups
+            Group testGroup = userManager.createGroup("testGroup");
+            for (int i = 0; i < 10; i++) {
+                Group nested = userManager.createGroup("nested_"+i);
+                memberIds.add("nested_"+i);
+            }
+            // add all members to the test group
+            testGroup.addMembers(memberIds.toArray(new String[0]));
+            systemSession.save();
+        } finally {
+            if (systemSession != null) {
+                systemSession.logout();
+            }
+        }
+    }
+
+    @Override
+    protected void runTest() throws Exception {
+        String id = getRandomUserId();
+        Session systemSession = null;
+        try {
+            systemSession = systemLogin();
+            UserManager um = ((JackrabbitSession) 
systemSession).getUserManager();
+            
+            Group g = um.getAuthorizable("testGroup", Group.class);
+            Authorizable member = um.getAuthorizable(id);
+            // trigger auto-membership evaluation
+            g.isMember(member);
+        } finally {
+            if (systemSession != null) {
+                systemSession.logout();
+            }
+        }
+
+    }
+
+    @Override
+    protected Configuration createConfiguration() {
+        return new Configuration() {
+            @Override
+            public AppConfigurationEntry[] getAppConfigurationEntry(String s) {
+                return new AppConfigurationEntry[] {
+                        new AppConfigurationEntry(
+                                GuestLoginModule.class.getName(),
+                                OPTIONAL,
+                                ImmutableMap.of()),
+                        new AppConfigurationEntry(
+                                TokenLoginModule.class.getName(),
+                                SUFFICIENT,
+                                ImmutableMap.of()),
+                        new AppConfigurationEntry(
+                                ExternalLoginModule.class.getName(),
+                                SUFFICIENT,
+                                ImmutableMap.of(
+                                        
ExternalLoginModule.PARAM_SYNC_HANDLER_NAME, syncConfig.getName(),
+                                        ExternalLoginModule.PARAM_IDP_NAME, 
idp.getName())),
+                        new AppConfigurationEntry(
+                                LoginModuleImpl.class.getName(),
+                                SUFFICIENT,
+                                ImmutableMap.of())
+                };
+            }
+        };
+    }
+
+    @Override
+    protected ConfigurationParameters getSecurityConfiguration() {
+        return ConfigurationParameters.of(UserConfiguration.NAME, 
ConfigurationParameters.of(ProtectedItemImporter.PARAM_IMPORT_BEHAVIOR, 
ImportBehavior.NAME_BESTEFFORT));
+    }
+}
\ No newline at end of file

Reply via email to