Calling getTopLevelGroups is slow inside GroupLDAPStorageMapper#getLDAPGroupMappingsConverted (#8430)

Closes #14820 
---------
Co-authored-by: Michal Hajas <mhajas@redhat.com>
This commit is contained in:
Bernd Bohmann
2023-09-20 17:20:43 +02:00
committed by GitHub
parent f8a9e0134a
commit bb2f59df87
20 changed files with 471 additions and 42 deletions

View File

@@ -22,6 +22,7 @@ import org.keycloak.models.Constants;
import org.keycloak.models.GroupModel;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.utils.KeycloakModelUtils;
import org.keycloak.testsuite.model.KeycloakModelTest;
import java.util.Arrays;
@@ -29,9 +30,11 @@ import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.nullValue;
public class GroupModelTest extends KeycloakModelTest {
@@ -99,4 +102,125 @@ public class GroupModelTest extends KeycloakModelTest {
});
}
@Test
public void testGroupByName() {
String subGroupId1 = withRealm(realmId, (session, realm) -> {
GroupModel group = session.groups().createGroup(realm, "parent-1");
GroupModel subGroup = session.groups().createGroup(realm, "sub-group-1", group);
return subGroup.getId();
});
String subGroupId2 = withRealm(realmId, (session, realm) -> {
GroupModel group = session.groups().createGroup(realm, "parent-2");
GroupModel subGroup = session.groups().createGroup(realm, "sub-group-1", group);
return subGroup.getId();
});
withRealm(realmId, (session, realm) -> {
GroupModel group1 = session.groups().getGroupByName(realm, null,"parent-1");
GroupModel group2 = session.groups().getGroupByName(realm, null,"parent-2");
GroupModel subGroup1 = session.groups().getGroupByName(realm, group1,"sub-group-1");
GroupModel subGroup2 = session.groups().getGroupByName(realm, group2,"sub-group-1");
assertThat(subGroup1.getId(), equalTo(subGroupId1));
assertThat(subGroup1.getName(), equalTo("sub-group-1"));
assertThat(subGroup2.getId(), equalTo(subGroupId2));
assertThat(subGroup2.getName(), equalTo("sub-group-1"));
return null;
});
}
@Test
public void testConflictingNames() {
final String conflictingGroupName = "conflicting-group-name";
String parentGroupWithChildId = withRealm(realmId, (session, realm) -> {
GroupModel parentGroupWithChild = session.groups().createGroup(realm, "parent-1");
GroupModel subGroup1 = session.groups().createGroup(realm, conflictingGroupName, parentGroupWithChild);
return parentGroupWithChild.getId();
});
String parentGroupWithConflictingNameId = withRealm(realmId, (session, realm) -> session.groups().createGroup(realm, conflictingGroupName).getId());
String parentGroupWithoutChildrenId = withRealm(realmId, (session, realm) -> session.groups().createGroup(realm, "parent-2").getId());
withRealm(realmId, (session, realm) -> {
GroupModel searchedGroup = session.groups().getGroupByName(realm, null, conflictingGroupName);
assertThat(searchedGroup, notNullValue());
assertThat(searchedGroup.getId(), equalTo(parentGroupWithConflictingNameId));
return null;
});
withRealm(realmId, (session, realm) -> {
GroupModel parentGroupWithChild = session.groups().getGroupById(realm, parentGroupWithChildId);
GroupModel searchedGroup = session.groups().getGroupByName(realm, parentGroupWithChild, conflictingGroupName);
assertThat(searchedGroup, notNullValue());
assertThat(searchedGroup.getParentId(), equalTo(parentGroupWithChildId));
return null;
});
withRealm(realmId, (session, realm) -> {
GroupModel parentGroupWithoutChildren = session.groups().getGroupById(realm, parentGroupWithoutChildrenId);
GroupModel searchedGroup = session.groups().getGroupByName(realm, parentGroupWithoutChildren, conflictingGroupName);
assertThat(searchedGroup, nullValue());
return null;
});
}
@Test
public void testGroupByNameCacheInvalidation() {
String subGroupId1 = withRealm(realmId, (session, realm) -> {
GroupModel group = session.groups().createGroup(realm, "parent-1");
GroupModel subGroup = session.groups().createGroup(realm, "sub-group-1", group);
return subGroup.getId();
});
withRealm(realmId, (session, realm) -> {
GroupModel group1 = session.groups().getGroupByName(realm, null, "parent-1");
GroupModel subGroup1 = session.groups().getGroupByName(realm, group1, "sub-group-1");
assertThat(subGroup1.getId(), equalTo(subGroupId1));
return null;
});
withRealm(realmId, (session, realm) -> {
GroupModel group1 = session.groups().getGroupByName(realm, null, "parent-1");
GroupModel subGroup1 = session.groups().getGroupByName(realm, group1, "sub-group-1");
session.groups().removeGroup(realm, subGroup1);
return null;
});
withRealm(realmId, (session, realm) -> {
GroupModel group1 = session.groups().getGroupByName(realm, null, "parent-1");
GroupModel subGroup1 = session.groups().getGroupByName(realm, group1, "sub-group-1");
assertThat(subGroup1, nullValue());
return null;
});
}
@Test
public void testFindGroupByPath() {
String subGroupId1 = withRealm(realmId, (session, realm) -> {
GroupModel group = session.groups().createGroup(realm, "parent-1");
GroupModel subGroup = session.groups().createGroup(realm, "sub-group-1", group);
return subGroup.getId();
});
String subGroupIdWithSlash = withRealm(realmId, (session, realm) -> {
GroupModel group = session.groups().createGroup(realm, "parent-2");
GroupModel subGroup = session.groups().createGroup(realm, "sub-group/1", group);
return subGroup.getId();
});
withRealm(realmId, (session, realm) -> {
GroupModel group1 = KeycloakModelUtils.findGroupByPath(session.groups(), realm, "/parent-1");
GroupModel group2 = KeycloakModelUtils.findGroupByPath(session.groups(), realm, "/parent-2");
assertThat(group1.getName(), equalTo("parent-1"));
assertThat(group2.getName(), equalTo("parent-2"));
GroupModel subGroup1 = KeycloakModelUtils.findGroupByPath(session.groups(), realm, "/parent-1/sub-group-1");
GroupModel subGroup2 = KeycloakModelUtils.findGroupByPath(session.groups(), realm, "/parent-2/sub-group/1");
assertThat(subGroup1.getId(), equalTo(subGroupId1));
assertThat(subGroup2.getId(), equalTo(subGroupIdWithSlash));
return null;
});
}
}