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 4352bb31fe OAK-10317 : Additional tests for dynamic automembership
4352bb31fe is described below

commit 4352bb31fe5ef74e8601ff1feb44d8f200bec303
Author: angela <[email protected]>
AuthorDate: Wed Jun 21 19:36:40 2023 +0200

    OAK-10317 : Additional tests for dynamic automembership
---
 .../external/impl/DynamicAutomembershipTest.java   | 208 +++++++++++++++++++--
 1 file changed, 191 insertions(+), 17 deletions(-)

diff --git 
a/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicAutomembershipTest.java
 
b/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicAutomembershipTest.java
index 1daf9ca16d..2b7deebeac 100644
--- 
a/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicAutomembershipTest.java
+++ 
b/oak-auth-external/src/test/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/DynamicAutomembershipTest.java
@@ -16,11 +16,13 @@
  */
 package org.apache.jackrabbit.oak.spi.security.authentication.external.impl;
 
+import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.guava.common.collect.Lists;
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.oak.api.Tree;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalGroup;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityRef;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.basic.DefaultSyncConfig;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
@@ -28,10 +30,12 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import javax.jcr.RepositoryException;
+import javax.jcr.ValueFactory;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.stream.StreamSupport;
 
+import static 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalIdentityConstants.REP_EXTERNAL_ID;
 import static 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalIdentityConstants.REP_EXTERNAL_PRINCIPAL_NAMES;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -51,11 +55,16 @@ public class DynamicAutomembershipTest extends 
DynamicSyncContextTest {
     
     private final boolean hasDynamicGroups;
     
-    private Group group1;
-    private Group group2;
-    private Group group3;
+    private Group groupAutomembership;
+    private Group userAutomembership;
+    private Group userAutomembership2;
     private Group groupInherited;
 
+    // users/groups for additional tests that are only executed if dynamic 
groups are enabled.
+    private Group externalGroup;
+    private User externalUser;
+    private Group testGroup;
+    
     public DynamicAutomembershipTest(boolean hasDynamicGroups, @NotNull String 
name) {
         this.hasDynamicGroups = hasDynamicGroups;
     }
@@ -64,24 +73,66 @@ public class DynamicAutomembershipTest extends 
DynamicSyncContextTest {
     public void before() throws Exception {
         super.before();
         
-        group1 = userManager.getAuthorizable("group1", Group.class);
-        group2 = userManager.getAuthorizable("group2", Group.class);
-        group3 = userManager.getAuthorizable("group3", Group.class);
+        groupAutomembership = 
userManager.getAuthorizable("groupAutomembership", Group.class);
+        userAutomembership = 
userManager.getAuthorizable("userAutomembership1", Group.class);
+        userAutomembership2 = 
userManager.getAuthorizable("userAutomembership2", Group.class);
 
         groupInherited = userManager.createGroup("groupInherited");
-        groupInherited.addMembers("group1", "group2");
+        groupInherited.addMembers("groupAutomembership", "userAutomembership");
+        
+        // setup for additional tests
+        if (hasDynamicGroups) {
+            assertNotNull(userAutomembership);
+            assertNotNull(groupAutomembership);
+        }
+
+        ValueFactory vf = getValueFactory(r);
+        externalUser = userManager.createUser("externalUser", null);
+        externalUser.setProperty(REP_EXTERNAL_ID, vf.createValue(new 
ExternalIdentityRef("externalUser", idp.getName()).getString()));
+
+        externalGroup = userManager.createGroup("externalGroup");
+        externalGroup.setProperty(REP_EXTERNAL_ID, vf.createValue(new 
ExternalIdentityRef("externalGroup", idp.getName()).getString()));
         r.commit();
     }
+    
+    @Override
+    public void after() throws Exception {
+        try {
+            if (externalUser != null) {
+                externalUser.remove();
+            }
+            if (externalGroup != null) {
+                externalGroup.remove();
+            }
+            if (testGroup != null) {
+                testGroup.remove();
+            }
+            root.commit();
+        } finally {
+            super.after();
+        }
+    }
 
     @Override
     protected @NotNull DefaultSyncConfig createSyncConfig() {
         DefaultSyncConfig config = super.createSyncConfig();
         config.group().setDynamicGroups(hasDynamicGroups);
-        config.group().setAutoMembership("group1");
-        config.user().setAutoMembership("group2", "group3");
+        config.group().setAutoMembership("groupAutomembership", 
"groupAutomembership");
+        config.user().setAutoMembership("userAutomembership1", 
"userAutomembership2");
         return config;
     }
 
+    private Group getTestGroup(@NotNull Authorizable... members) throws 
Exception {
+        if (testGroup == null) {
+            testGroup = userManager.createGroup("testGroup");
+        }
+        for (Authorizable member : members) {
+            testGroup.addMember(member);
+        }
+        r.commit();
+        return testGroup;
+    }
+
     private static boolean containsGroup(@NotNull Iterator<Group> membership, 
@NotNull Group groupToTest) throws RepositoryException {
         String groupIdToTest = groupToTest.getID();
         Iterable<Group> iterable = () -> membership;
@@ -107,15 +158,15 @@ public class DynamicAutomembershipTest extends 
DynamicSyncContextTest {
             assertNotNull(gr);
             assertTrue(r.hasPendingChanges());
 
-            // verify group1-externalGroup relationship
-            assertTrue(containsGroup(gr.declaredMemberOf(), group1));
-            assertTrue(containsGroup(gr.memberOf(), group1));
-            assertTrue(group1.isDeclaredMember(gr));
-            assertTrue(group1.isMember(gr));
-            
assertFalse(hasStoredMembershipInformation(r.getTree(group1.getPath()), 
r.getTree(gr.getPath())));
+            // verify groupAutomembership-externalGroup relationship
+            assertTrue(containsGroup(gr.declaredMemberOf(), 
groupAutomembership));
+            assertTrue(containsGroup(gr.memberOf(), groupAutomembership));
+            assertTrue(groupAutomembership.isDeclaredMember(gr));
+            assertTrue(groupAutomembership.isMember(gr));
+            
assertFalse(hasStoredMembershipInformation(r.getTree(groupAutomembership.getPath()),
 r.getTree(gr.getPath())));
 
             // user-specific automembership must not be reflected.
-            for (Group g : new Group[] {group2, group3}) {
+            for (Group g : new Group[] {userAutomembership, 
userAutomembership2}) {
                 assertFalse(g.isDeclaredMember(gr));
                 assertFalse(g.isMember(gr));
             }
@@ -149,7 +200,7 @@ public class DynamicAutomembershipTest extends 
DynamicSyncContextTest {
         assertSyncedMembership(userManager, user, previouslySyncedUser);
         
         // verify automembership of the external user
-        for (Group gr : new Group[] {group1, group2, group3}) {
+        for (Group gr : new Group[] {groupAutomembership, userAutomembership, 
userAutomembership2}) {
             assertTrue(gr.isDeclaredMember(user));
             assertTrue(gr.isMember(user));
             containsGroup(user.declaredMemberOf(), gr);
@@ -173,4 +224,127 @@ public class DynamicAutomembershipTest extends 
DynamicSyncContextTest {
         Group previousGroup = 
userManager.getAuthorizable(previouslySyncedUser.getDeclaredGroups().iterator().next().getId(),
 Group.class);
         assertNotNull(previousGroup);
     }
+
+    // the following additional tests are only run if dynamic groups are 
enabled.
+    @Test
+    public void testIsDeclaredMemberConfiguredUserAutoMembership() throws 
Exception {
+        if (!hasDynamicGroups) {
+            return;
+        }
+        assertFalse(userAutomembership.isDeclaredMember(getTestUser()));
+        assertFalse(userAutomembership.isDeclaredMember(getTestGroup()));
+        assertFalse(userAutomembership.isDeclaredMember(externalGroup));
+
+        assertTrue(userAutomembership.isDeclaredMember(externalUser));
+    }
+
+    @Test
+    public void testIsDeclaredMemberConfiguredGroupAutoMembership() throws 
Exception {
+        if (!hasDynamicGroups) {
+            return;
+        }
+        
+        assertFalse(groupAutomembership.isDeclaredMember(getTestUser()));
+        assertFalse(groupAutomembership.isDeclaredMember(getTestGroup()));
+
+        assertTrue(groupAutomembership.isDeclaredMember(externalGroup));
+        // dynamic automembership for users also includes the configured 
group-automembership (to account for cases where dynamic-group option is false)
+        assertTrue(groupAutomembership.isDeclaredMember(externalUser));
+    }
+
+    @Test
+    public void testIsMemberConfiguredUserAutoMembership() throws Exception {
+        if (!hasDynamicGroups) {
+            return;
+        }
+        
+        assertFalse(userAutomembership.isMember(getTestUser()));
+        assertFalse(userAutomembership.isMember(getTestGroup()));
+        assertFalse(userAutomembership.isMember(externalGroup));
+
+        assertTrue(userAutomembership.isMember(externalUser));
+    }
+
+    @Test
+    public void testIsMemberConfiguredGroupAutoMembership() throws Exception {
+        if (!hasDynamicGroups) {
+            return;
+        }
+        
+        assertFalse(groupAutomembership.isMember(getTestUser()));
+        assertFalse(groupAutomembership.isMember(getTestGroup()));
+
+        assertTrue(groupAutomembership.isMember(externalGroup));
+        // dynamic automembership for users also includes the configured 
group-automembership (to account for cases where dynamic-group option is false)
+        assertTrue(groupAutomembership.isMember(externalUser));
+    }
+
+    @Test
+    public void testIsMemberNestedGroup() throws Exception {
+        if (!hasDynamicGroups) {
+            return;
+        }
+        
+        // automembership groups are members of other groups
+        User testuser = getTestUser();
+        Group nested = getTestGroup(userAutomembership, groupAutomembership, 
testuser);
+        root.commit();
+
+        // test nested group
+        assertTrue(nested.isMember(testuser));
+        assertTrue(nested.isMember(userAutomembership));
+        assertTrue(nested.isMember(groupAutomembership));
+        assertTrue(nested.isMember(externalUser));
+        assertTrue(nested.isMember(externalGroup));
+
+        // user-automembership-group
+        assertFalse(userAutomembership.isMember(nested));
+        assertFalse(userAutomembership.isMember(testuser));
+        assertFalse(userAutomembership.isMember(groupAutomembership));
+        assertFalse(userAutomembership.isMember(externalGroup));
+        assertTrue(userAutomembership.isMember(externalUser));
+
+        // group-automembership-group
+        assertFalse(groupAutomembership.isMember(nested));
+        assertFalse(groupAutomembership.isMember(testuser));
+        assertFalse(groupAutomembership.isMember(userAutomembership));
+        assertTrue(groupAutomembership.isMember(externalGroup));
+        // dynamic automembership for users also includes the configured 
group-automembership (to account for cases where dynamic-group option is false)
+        assertTrue(groupAutomembership.isMember(externalUser));
+    }
+
+    @Test
+    public void testIsMemberNestedGroupInverse() throws Exception {
+        if (!hasDynamicGroups) {
+            return;
+        }
+        
+        User testuser = getTestUser();
+        Group nested = getTestGroup(testuser);
+        userAutomembership.addMember(nested);
+        groupAutomembership.addMember(nested);
+        root.commit();
+
+        // test nested group
+        assertTrue(nested.isMember(testuser));
+        assertFalse(nested.isMember(userAutomembership));
+        assertFalse(nested.isMember(groupAutomembership));
+        assertFalse(nested.isMember(externalUser));
+        assertFalse(nested.isMember(externalGroup));
+
+        // user-automembership-group
+        assertTrue(userAutomembership.isMember(nested));
+        assertTrue(userAutomembership.isMember(testuser));
+        assertFalse(userAutomembership.isMember(groupAutomembership));
+        assertFalse(userAutomembership.isMember(externalGroup));
+        assertTrue(userAutomembership.isMember(externalUser));
+
+        // group-automembership-group
+        assertTrue(groupAutomembership.isMember(nested));
+        assertTrue(groupAutomembership.isMember(testuser));
+        assertFalse(groupAutomembership.isMember(userAutomembership));
+        assertTrue(groupAutomembership.isMember(externalGroup));
+        // dynamic automembership for users also includes the configured 
group-automembership (to account for cases where dynamic-group option is false)
+        assertTrue(groupAutomembership.isMember(externalUser));
+    }
 }
\ No newline at end of file

Reply via email to