/* * Copyright (c) 2016 Evolveum * * Licensed 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 com.evolveum.midpoint.testing.story; import static com.evolveum.midpoint.test.IntegrationTestTools.assertAttribute; import static com.evolveum.midpoint.test.IntegrationTestTools.assertNoAttribute; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import java.io.File; import java.util.List; import javax.xml.namespace.QName; import org.opends.server.types.DirectoryException; import org.opends.server.types.Entry; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.AfterClass; import org.testng.annotations.Test; import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.NameItemPathSegment; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.exception.CommonException; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.PolicyViolationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** * Common superclass for LDAP hierarchy tests TestLdapFlat, TestLdapNested * * @author Radovan Semancik * */ @ContextConfiguration(locations = {"classpath:ctx-story-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public abstract class AbstractLdapHierarchyTest extends AbstractStoryTest { protected static final String RESOURCE_OPENDJ_OID = "10000000-0000-0000-0000-000000000003"; protected static final String RESOURCE_OPENDJ_NAMESPACE = MidPointConstants.NS_RI; protected static final QName OPENDJ_ASSOCIATION_GROUP_NAME = new QName(RESOURCE_OPENDJ_NAMESPACE, "group"); public static final String ORG_TOP_OID = "00000000-8888-6666-0000-100000000001"; public static final String ROLE_META_ORG_OID = "10000000-0000-0000-0000-000000006601"; protected static final String ORG_ROYULA_CARPATHIA_NAME = "Royula Carpathia"; protected static final String ORG_CORTUV_HRAD_NAME = "Čortův hrád"; protected static final String ORG_CORTUV_HRAD_NAME2 = "ani zblo"; protected static final String ORG_VYSNE_VLKODLAKY_NAME = "Vyšné Vlkodlaky"; protected static final String ORG_ROYULA_DIABOLICA_NAME = "Royula Diábolica"; protected static final String ORG_TYPE_FUNCTIONAL = "functional"; protected static final String LDAP_GROUP_INTENT = "group"; protected static final String USER_TELEKE_USERNAME = "teleke"; protected static final String USER_TELEKE_GIVEN_NAME = "Felix"; protected static final String USER_TELEKE_FAMILY_NAME = "Teleke z Tölökö"; protected static final String USER_GORC_USERNAME = "gorc"; protected static final String USER_GORC_USERNAME2 = "obluda"; protected static final String USER_GORC_GIVEN_NAME = "Robert"; protected static final String USER_GORC_FAMILY_NAME = "Gorc z Gorců"; protected static final String USER_DEZI_USERNAME = "dezi"; protected static final String USER_DEZI_GIVEN_NAME = "Vilja"; protected static final String USER_DEZI_FAMILY_NAME = "Dézi"; protected ResourceType resourceOpenDjType; protected PrismObject<ResourceType> resourceOpenDj; protected String orgRolyulaCarpathiaOid; protected String orgCortuvHradOid; protected String orgVysneVlkodlakyOid; protected String orgRolyulaDiabolicaOid; protected String userGorcOid; protected abstract File getTestDir(); protected File getResourceOpenDjFile() { return new File(getTestDir(), "resource-opendj.xml"); } protected File getOrgTopFile() { return new File(getTestDir(), "org-top.xml"); } protected File getRoleMetaOrgFile() { return new File(getTestDir(), "role-meta-org.xml"); } @Override protected void startResources() throws Exception { openDJController.startCleanServerRI(); } @AfterClass public static void stopResources() throws Exception { openDJController.stop(); } @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); // Resources resourceOpenDj = importAndGetObjectFromFile(ResourceType.class, getResourceOpenDjFile(), RESOURCE_OPENDJ_OID, initTask, initResult); resourceOpenDjType = resourceOpenDj.asObjectable(); openDJController.setResource(resourceOpenDj); // Org importObjectFromFile(getOrgTopFile(), initResult); // Role importObjectFromFile(getRoleMetaOrgFile(), initResult); } @Test public void test000Sanity() throws Exception { final String TEST_NAME = "test000Sanity"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); OperationResult testResultOpenDj = modelService.testResource(RESOURCE_OPENDJ_OID, task); TestUtil.assertSuccess(testResultOpenDj); dumpOrgTree(); dumpLdap(); } @Test public void test100AddOrgRoyulaCarpathia() throws Exception { final String TEST_NAME = "test100AddOrgRoyulaCarpathia"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<OrgType> orgBefore = createOrg(ORG_ROYULA_CARPATHIA_NAME, ORG_TOP_OID); // WHEN TestUtil.displayWhen(TEST_NAME); display("Adding org", orgBefore); addObject(orgBefore, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<OrgType> orgAfter = getAndAssertFunctionalOrg(ORG_ROYULA_CARPATHIA_NAME, ORG_TOP_OID); orgRolyulaCarpathiaOid = orgAfter.getOid(); assertSubOrgs(orgAfter, 0); assertSubOrgs(ORG_TOP_OID, 1); } @Test public void test110AddUserTeleke() throws Exception { final String TEST_NAME = "test110AddUserTeleke"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = createUser(USER_TELEKE_USERNAME, USER_TELEKE_GIVEN_NAME, USER_TELEKE_FAMILY_NAME, orgRolyulaCarpathiaOid); // WHEN TestUtil.displayWhen(TEST_NAME); display("Adding user", userBefore); addObject(userBefore, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<UserType> userAfter = getAndAssertUser(USER_TELEKE_USERNAME, ORG_ROYULA_CARPATHIA_NAME); PrismObject<OrgType> orgAfter = getAndAssertFunctionalOrg(ORG_ROYULA_CARPATHIA_NAME, ORG_TOP_OID); assertSubOrgs(orgAfter, 0); assertSubOrgs(ORG_TOP_OID, 1); } @Test public void test200AddOrgCortuvHrad() throws Exception { final String TEST_NAME = "test200AddOrgCortuvHrad"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<OrgType> orgBefore = createOrg(ORG_CORTUV_HRAD_NAME, orgRolyulaCarpathiaOid); // WHEN TestUtil.displayWhen(TEST_NAME); display("Adding org", orgBefore); addObject(orgBefore, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<OrgType> orgAfter = getAndAssertFunctionalOrg(ORG_CORTUV_HRAD_NAME, orgRolyulaCarpathiaOid); orgCortuvHradOid = orgAfter.getOid(); assertSubOrgs(orgAfter, 0); assertSubOrgs(orgRolyulaCarpathiaOid, 1); assertSubOrgs(ORG_TOP_OID, 1); } @Test public void test210AddUserGorc() throws Exception { final String TEST_NAME = "test210AddUserGorc"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = createUser(USER_GORC_USERNAME, USER_GORC_GIVEN_NAME, USER_GORC_FAMILY_NAME, orgCortuvHradOid); // WHEN TestUtil.displayWhen(TEST_NAME); display("Adding user", userBefore); addObject(userBefore, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<UserType> userAfter = getAndAssertUser(USER_GORC_USERNAME, ORG_CORTUV_HRAD_NAME, ORG_ROYULA_CARPATHIA_NAME); userGorcOid = userAfter.getOid(); } @Test public void test220AddOrgVysneVlkodlaky() throws Exception { final String TEST_NAME = "test220AddOrgVysneVlkodlaky"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<OrgType> orgBefore = createOrg(ORG_VYSNE_VLKODLAKY_NAME, orgCortuvHradOid); // WHEN TestUtil.displayWhen(TEST_NAME); display("Adding org", orgBefore); addObject(orgBefore, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<OrgType> orgAfter = getAndAssertFunctionalOrg(ORG_VYSNE_VLKODLAKY_NAME, orgCortuvHradOid); orgVysneVlkodlakyOid = orgAfter.getOid(); assertSubOrgs(orgAfter, 0); assertSubOrgs(orgRolyulaCarpathiaOid, 1); assertSubOrgs(ORG_TOP_OID, 1); } @Test public void test230AddUserViljaDezi() throws Exception { final String TEST_NAME = "test230AddUserViljaDezi"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = createUser(USER_DEZI_USERNAME, USER_DEZI_GIVEN_NAME, USER_DEZI_FAMILY_NAME, orgVysneVlkodlakyOid); // WHEN TestUtil.displayWhen(TEST_NAME); display("Adding user", userBefore); addObject(userBefore, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<UserType> userAfter = getAndAssertUser(USER_DEZI_USERNAME, ORG_VYSNE_VLKODLAKY_NAME, ORG_CORTUV_HRAD_NAME, ORG_ROYULA_CARPATHIA_NAME); } @Test public void test300RenameOrgCortuvHrad() throws Exception { final String TEST_NAME = "test300RenameOrgCortuvHrad"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<OrgType> orgBefore = createOrg(ORG_CORTUV_HRAD_NAME, orgRolyulaCarpathiaOid); // WHEN TestUtil.displayWhen(TEST_NAME); display("Adding org", orgBefore); modifyObjectReplaceProperty(OrgType.class, orgCortuvHradOid, OrgType.F_NAME, task, result, new PolyString(ORG_CORTUV_HRAD_NAME2)); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<OrgType> orgAfter = getAndAssertFunctionalOrg(ORG_CORTUV_HRAD_NAME2, orgRolyulaCarpathiaOid); assertEquals("Cortuv hrad org OID changed after rename", orgCortuvHradOid, orgAfter.getOid()); getAndAssertUser(USER_DEZI_USERNAME, ORG_VYSNE_VLKODLAKY_NAME, ORG_CORTUV_HRAD_NAME2, ORG_ROYULA_CARPATHIA_NAME); assertSubOrgs(orgAfter, 1); assertSubOrgs(orgRolyulaCarpathiaOid, 1); assertSubOrgs(ORG_TOP_OID, 1); assertSubOrgs(orgVysneVlkodlakyOid, 0); } @Test public void test310RenameUserGorc() throws Exception { final String TEST_NAME = "test310RenameUserGorc"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = createUser(USER_GORC_USERNAME, USER_GORC_GIVEN_NAME, USER_GORC_FAMILY_NAME, orgCortuvHradOid); // WHEN TestUtil.displayWhen(TEST_NAME); modifyObjectReplaceProperty(UserType.class, userGorcOid, UserType.F_NAME, task, result, new PolyString(USER_GORC_USERNAME2)); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<UserType> userAfter = getAndAssertUser(USER_GORC_USERNAME2, ORG_CORTUV_HRAD_NAME2, ORG_ROYULA_CARPATHIA_NAME); } @Test public void test320AddOrgRoyulaDiabolica() throws Exception { final String TEST_NAME = "test320AddOrgRoyulaDiabolica"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<OrgType> orgBefore = createOrg(ORG_ROYULA_DIABOLICA_NAME, ORG_TOP_OID); // WHEN TestUtil.displayWhen(TEST_NAME); display("Adding org", orgBefore); addObject(orgBefore, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<OrgType> orgAfter = getAndAssertFunctionalOrg(ORG_ROYULA_DIABOLICA_NAME, ORG_TOP_OID); orgRolyulaDiabolicaOid = orgAfter.getOid(); assertSubOrgs(orgAfter, 0); assertSubOrgs(ORG_TOP_OID, 2); assertSubOrgs(orgRolyulaDiabolicaOid, 0); assertSubOrgs(orgRolyulaCarpathiaOid, 1); } @Test public void test322MoveOrgZblo() throws Exception { final String TEST_NAME = "test322MoveOrgZblo"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(AbstractLdapHierarchyTest.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<OrgType> orgBefore = getOrg(ORG_CORTUV_HRAD_NAME2); ObjectDelta<OrgType> delta = orgBefore.createModifyDelta(); PrismContainerValue<AssignmentType> oldAssignment = null; for (PrismContainerValue aval: orgBefore.findContainer(OrgType.F_ASSIGNMENT).getValues()) { oldAssignment = (PrismContainerValue<AssignmentType>)aval; if (OrgType.COMPLEX_TYPE.equals(oldAssignment.asContainerable().getTargetRef().getType())) { break; } } delta.addModificationDeleteContainer(OrgType.F_ASSIGNMENT, oldAssignment.clone()); AssignmentType newAssignmentType = new AssignmentType(); ObjectReferenceType targetRef = new ObjectReferenceType(); targetRef.setOid(orgRolyulaDiabolicaOid); targetRef.setType(OrgType.COMPLEX_TYPE); newAssignmentType.setTargetRef(targetRef); delta.addModificationAddContainer(OrgType.F_ASSIGNMENT, newAssignmentType); // WHEN TestUtil.displayWhen(TEST_NAME); display("Modifying "+orgBefore+"with delta", delta); modelService.executeChanges(MiscSchemaUtil.createCollection(delta), null, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); dumpOrgTree(); dumpLdap(); PrismObject<OrgType> orgAfter = getAndAssertFunctionalOrg(ORG_CORTUV_HRAD_NAME2, orgRolyulaDiabolicaOid); assertEquals("Cortuv hrad org OID changed after rename", orgCortuvHradOid, orgAfter.getOid()); recomputeIfNeeded(orgCortuvHradOid); dumpOrgTree(); dumpLdap(); getAndAssertUser(USER_GORC_USERNAME2, ORG_CORTUV_HRAD_NAME2, ORG_ROYULA_DIABOLICA_NAME); getAndAssertUser(USER_DEZI_USERNAME, ORG_VYSNE_VLKODLAKY_NAME, ORG_CORTUV_HRAD_NAME2, ORG_ROYULA_DIABOLICA_NAME); assertSubOrgs(orgAfter, 1); assertSubOrgs(orgRolyulaCarpathiaOid, 0); assertSubOrgs(orgRolyulaDiabolicaOid, 1); assertSubOrgs(ORG_TOP_OID, 2); assertSubOrgs(orgVysneVlkodlakyOid, 0); } protected void recomputeIfNeeded(String changedOrgOid) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { // nothing to do by default } private PrismObject<UserType> createUser(String username, String givenName, String familyName, String parentOrgOid) throws SchemaException { PrismObject<UserType> user = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class).instantiate(); UserType userType = user.asObjectable(); userType.setName(new PolyStringType(username)); userType.setGivenName(new PolyStringType(givenName)); userType.setFamilyName(new PolyStringType(familyName)); userType.setFullName(new PolyStringType(givenName + " " + familyName)); if (parentOrgOid != null) { AssignmentType parentAssignment = new AssignmentType(); ObjectReferenceType parentAssignmentTargetRef = new ObjectReferenceType(); parentAssignmentTargetRef.setOid(parentOrgOid); parentAssignmentTargetRef.setType(OrgType.COMPLEX_TYPE); parentAssignment.setTargetRef(parentAssignmentTargetRef); userType.getAssignment().add(parentAssignment); } return user; } private PrismObject<OrgType> createOrg(String name, String parentOrgOid) throws SchemaException { PrismObject<OrgType> org = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(OrgType.class).instantiate(); OrgType orgType = org.asObjectable(); orgType.setName(new PolyStringType(name)); orgType.getOrgType().add(ORG_TYPE_FUNCTIONAL); AssignmentType metaRoleAssignment = new AssignmentType(); ObjectReferenceType metaRoleAssignmentTargetRef = new ObjectReferenceType(); metaRoleAssignmentTargetRef.setOid(ROLE_META_ORG_OID); metaRoleAssignmentTargetRef.setType(RoleType.COMPLEX_TYPE); metaRoleAssignment.setTargetRef(metaRoleAssignmentTargetRef); orgType.getAssignment().add(metaRoleAssignment); if (parentOrgOid != null) { AssignmentType parentAssignment = new AssignmentType(); ObjectReferenceType parentAssignmentTargetRef = new ObjectReferenceType(); parentAssignmentTargetRef.setOid(parentOrgOid); parentAssignmentTargetRef.setType(OrgType.COMPLEX_TYPE); parentAssignment.setTargetRef(parentAssignmentTargetRef); orgType.getAssignment().add(parentAssignment); } return org; } protected PrismObject<UserType> getAndAssertUser(String username, String directOrgGroupname, String... indirectGroupNames) throws SchemaException, CommonException, SecurityViolationException, CommunicationException, ConfigurationException, DirectoryException { PrismObject<UserType> user = findUserByUsername(username); display("user", user); String shadowOid = getLinkRefOid(user, RESOURCE_OPENDJ_OID, ShadowKindType.ACCOUNT, SchemaConstants.INTENT_DEFAULT); PrismObject<ShadowType> accountShadow = getShadowModel(shadowOid); display("Account "+username+" shadow", accountShadow); // TODO assert shadow content Entry accountEntry = openDJController.searchSingle("uid="+username); assertNotNull("No account LDAP entry for "+username, accountEntry); display("account entry", openDJController.toHumanReadableLdifoid(accountEntry)); openDJController.assertObjectClass(accountEntry, "inetOrgPerson"); return user; } protected PrismObject<OrgType> getAndAssertFunctionalOrg(String orgName, String directParentOrgOid) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, DirectoryException { PrismObject<OrgType> org = getOrg(orgName); display("org", org); PrismAsserts.assertPropertyValue(org, OrgType.F_ORG_TYPE, ORG_TYPE_FUNCTIONAL); assertAssignedRole(org, ROLE_META_ORG_OID); String groupOid = getLinkRefOid(org, RESOURCE_OPENDJ_OID, ShadowKindType.ENTITLEMENT, LDAP_GROUP_INTENT); PrismObject<ShadowType> groupShadow = getShadowModel(groupOid); display("Org "+orgName+" group shadow", groupShadow); // TODO assert shadow content Entry groupEntry = openDJController.searchSingle("cn="+orgName); assertNotNull("No group LDAP entry for "+orgName, groupEntry); display("OU GROUP entry", openDJController.toHumanReadableLdifoid(groupEntry)); openDJController.assertObjectClass(groupEntry, "groupOfUniqueNames"); assertHasOrg(org, directParentOrgOid); assertAssignedOrg(org, directParentOrgOid); return org; } protected PrismObject<OrgType> getOrg(String orgName) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { PrismObject<OrgType> org = findObjectByName(OrgType.class, orgName); assertNotNull("The org "+orgName+" is missing!", org); display("Org "+orgName, org); PrismAsserts.assertPropertyValue(org, OrgType.F_NAME, PrismTestUtil.createPolyString(orgName)); return org; } protected void dumpOrgTree() throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { display("Org tree", dumpOrgTree(ORG_TOP_OID)); } protected void dumpLdap() throws DirectoryException { display("LDAP server tree", openDJController.dumpTree()); display("LDAP server content", openDJController.dumpEntries()); } protected void assertGroupMembers(PrismObject<OrgType> org, String... members) throws Exception { String groupOid = getLinkRefOid(org, RESOURCE_OPENDJ_OID, ShadowKindType.ENTITLEMENT, "org-group"); PrismObject<ShadowType> groupShadow = getShadowModel(groupOid); assertAttribute(groupShadow, new QName(MidPointConstants.NS_RI, "uniqueMember"), members); } protected void assertNoGroupMembers(PrismObject<OrgType> org) throws Exception { String groupOid = getLinkRefOid(org, RESOURCE_OPENDJ_OID, ShadowKindType.ENTITLEMENT, "org-group"); PrismObject<ShadowType> groupShadow = getShadowModel(groupOid); assertNoAttribute(groupShadow, new QName(MidPointConstants.NS_RI, "uniqueMember")); } protected void reconcileAllUsers() throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { final Task task = createTask("reconcileAllUsers"); OperationResult result = task.getResult(); ResultHandler<UserType> handler = new ResultHandler<UserType>() { @Override public boolean handle(PrismObject<UserType> object, OperationResult parentResult) { try { display("reconciling "+object); reconcileUser(object.getOid(), task, parentResult); } catch (SchemaException | PolicyViolationException | ExpressionEvaluationException | ObjectNotFoundException | ObjectAlreadyExistsException | CommunicationException | ConfigurationException | SecurityViolationException e) { throw new SystemException(e.getMessage(), e); } return true; } }; display("Reconciling all users"); modelService.searchObjectsIterative(UserType.class, null, handler, null, task, result); } protected void reconcileAllOrgs() throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException { final Task task = createTask("reconcileAllOrgs"); OperationResult result = task.getResult(); ResultHandler<OrgType> handler = new ResultHandler<OrgType>() { @Override public boolean handle(PrismObject<OrgType> object, OperationResult parentResult) { try { display("reconciling "+object); reconcileOrg(object.getOid(), task, parentResult); } catch (SchemaException | PolicyViolationException | ExpressionEvaluationException | ObjectNotFoundException | ObjectAlreadyExistsException | CommunicationException | ConfigurationException | SecurityViolationException e) { throw new SystemException(e.getMessage(), e); } return true; } }; display("Reconciling all orgs"); modelService.searchObjectsIterative(OrgType.class, null, handler, null, task, result); } }