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