/*
* Copyright (c) 2010-2015 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 com.evolveum.icf.dummy.resource.DummyObjectClass;
import com.evolveum.icf.dummy.resource.DummyPrivilege;
import com.evolveum.icf.dummy.resource.DummyResource;
import com.evolveum.icf.dummy.resource.DummySyncStyle;
import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskHandler;
import com.evolveum.midpoint.model.impl.util.DebugReconciliationTaskResultListener;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
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.task.api.Task;
import com.evolveum.midpoint.test.DummyResourceContoller;
import com.evolveum.midpoint.test.util.MidPointTestConstants;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.exception.CommunicationException;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
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.ShadowKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import org.opends.server.types.DirectoryException;
import org.opends.server.types.Entry;
import org.opends.server.types.SearchResultEntry;
import org.springframework.beans.factory.annotation.Autowired;
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 javax.xml.namespace.QName;
import java.io.File;
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 static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
/**
* @author Radovan Semancik
* @author mederly
*
*/
@ContextConfiguration(locations = {"classpath:ctx-story-test-main.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class TestUniversity extends AbstractStoryTest {
public static final File TEST_DIR = new File(MidPointTestConstants.TEST_RESOURCES_DIR, "university");
public static final File OBJECT_TEMPLATE_ORG_FILE = new File(TEST_DIR, "object-template-org.xml");
public static final String OBJECT_TEMPLATE_ORG_OID = "10000000-0000-0000-0000-000000000231";
protected static final File RESOURCE_DUMMY_HR_FILE = new File(TEST_DIR, "resource-dummy-hr.xml");
protected static final String RESOURCE_DUMMY_HR_ID = "HR";
protected static final String RESOURCE_DUMMY_HR_OID = "10000000-0000-0000-0000-000000000001";
protected static final File RESOURCE_OPENDJ_FILE = new File(TEST_DIR, "resource-opendj.xml");
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");
private static final String DUMMY_PRIVILEGE_ATTRIBUTE_HR_ORGPATH = "orgpath";
public static final File ORG_TOP_FILE = new File(TEST_DIR, "org-top.xml");
public static final String ORG_TOP_OID = "00000000-8888-6666-0000-100000000001";
public static final File ROLE_META_ORG_FILE = new File(TEST_DIR, "role-meta-org.xml");
public static final String ROLE_META_ORG_OID = "10000000-0000-0000-0000-000000006601";
protected static final File TASK_LIVE_SYNC_DUMMY_HR_FILE = new File(TEST_DIR, "task-dummy-hr-livesync.xml");
protected static final String TASK_LIVE_SYNC_DUMMY_HR_OID = "10000000-0000-0000-5555-555500000001";
protected static final File TASK_RECON_OPENDJ_DEFAULT_SINGLE_FILE = new File(TEST_DIR, "task-reconcile-opendj-default-single.xml");
protected static final String TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID = "10000000-0000-0000-5555-555500000004";
protected static final File TASK_RECON_OPENDJ_LDAPGROUP_SINGLE_FILE = new File(TEST_DIR, "task-reconcile-opendj-ldapgroup-single.xml");
protected static final String TASK_RECON_OPENDJ_LDAPGROUP_SINGLE_OID = "10000000-0000-0000-5555-555500000014";
private static final File SCABB_OU_LDIF_FILE = new File(TEST_DIR, "scabb.ldif");
private static final File BOOTY_OU_LDIF_FILE = new File(TEST_DIR, "booty.ldif");
private static final File BOOTY_LOOKOUT_OU_LDIF_FILE = new File(TEST_DIR, "booty-lookout.ldif");
@Autowired
private ReconciliationTaskHandler reconciliationTaskHandler;
private DebugReconciliationTaskResultListener reconciliationTaskResultListener;
protected static DummyResource dummyResourceHr;
protected static DummyResourceContoller dummyResourceCtlHr;
protected ResourceType resourceDummyHrType;
protected PrismObject<ResourceType> resourceDummyHr;
protected ResourceType resourceOpenDjType;
protected PrismObject<ResourceType> resourceOpenDj;
@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);
reconciliationTaskResultListener = new DebugReconciliationTaskResultListener();
reconciliationTaskHandler.setReconciliationTaskResultListener(reconciliationTaskResultListener);
// Resources
dummyResourceCtlHr = DummyResourceContoller.create(RESOURCE_DUMMY_HR_ID, resourceDummyHr);
DummyObjectClass privilegeObjectClass = dummyResourceCtlHr.getDummyResource().getPrivilegeObjectClass();
dummyResourceCtlHr.addAttrDef(privilegeObjectClass, DUMMY_PRIVILEGE_ATTRIBUTE_HR_ORGPATH, String.class, false, false);
dummyResourceHr = dummyResourceCtlHr.getDummyResource();
resourceDummyHr = importAndGetObjectFromFile(ResourceType.class, RESOURCE_DUMMY_HR_FILE, RESOURCE_DUMMY_HR_OID, initTask, initResult);
resourceDummyHrType = resourceDummyHr.asObjectable();
dummyResourceCtlHr.setResource(resourceDummyHr);
dummyResourceHr.setSyncStyle(DummySyncStyle.SMART);
resourceOpenDj = importAndGetObjectFromFile(ResourceType.class, RESOURCE_OPENDJ_FILE, RESOURCE_OPENDJ_OID, initTask, initResult);
resourceOpenDjType = resourceOpenDj.asObjectable();
openDJController.setResource(resourceOpenDj);
// // LDAP content
// openDJController.addEntryFromLdifFile(SCABB_OU_LDIF_FILE);
// openDJController.addEntryFromLdifFile(BOOTY_OU_LDIF_FILE);
// openDJController.addEntryFromLdifFile(BOOTY_LOOKOUT_OU_LDIF_FILE);
//
// Object Templates
importObjectFromFile(OBJECT_TEMPLATE_ORG_FILE, initResult);
setDefaultObjectTemplate(OrgType.COMPLEX_TYPE, OBJECT_TEMPLATE_ORG_OID);
// Org
importObjectFromFile(ORG_TOP_FILE, initResult);
// Role
importObjectFromFile(ROLE_META_ORG_FILE, initResult);
// Tasks
importObjectFromFile(TASK_LIVE_SYNC_DUMMY_HR_FILE, 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 testResultHr = modelService.testResource(RESOURCE_DUMMY_HR_OID, task);
TestUtil.assertSuccess(testResultHr);
OperationResult testResultOpenDj = modelService.testResource(RESOURCE_OPENDJ_OID, task);
TestUtil.assertSuccess(testResultOpenDj);
waitForTaskStart(TASK_LIVE_SYNC_DUMMY_HR_OID, false);
dumpOrgTree();
}
@Test
public void test100AddComeniusUniversity() throws Exception {
final String TEST_NAME = "test100AddComeniusUniversity";
TestUtil.displayTestTile(this, TEST_NAME);
Task task = taskManager.createTaskInstance(TestUniversity.class.getName() + "." + TEST_NAME);
DummyPrivilege comenius = new DummyPrivilege("UK");
// WHEN
dummyResourceHr.addPrivilege(comenius);
waitForTaskNextRunAssertSuccess(TASK_LIVE_SYNC_DUMMY_HR_OID, true);
// THEN
PrismObject<OrgType> org = getAndAssertFunctionalOrg("UK");
assertNotNull("Comenius University was not found", org);
display("Org", org);
dumpOrgTree();
assertHasOrg(org, ORG_TOP_OID);
assertAssignedOrg(org, ORG_TOP_OID);
assertSubOrgs(org, 0);
assertSubOrgs(ORG_TOP_OID, 1);
}
@Test
public void test110AddComeniusStructure() throws Exception {
final String TEST_NAME = "test110AddComeniusStructure";
TestUtil.displayTestTile(this, TEST_NAME);
Task task = taskManager.createTaskInstance(TestUniversity.class.getName() + "." + TEST_NAME);
DummyPrivilege srcFmfi = new DummyPrivilege("FMFI");
srcFmfi.addAttributeValue(DUMMY_PRIVILEGE_ATTRIBUTE_HR_ORGPATH, "UK");
DummyPrivilege srcVc = new DummyPrivilege("VC");
srcVc.addAttributeValue(DUMMY_PRIVILEGE_ATTRIBUTE_HR_ORGPATH, "UK:FMFI");
DummyPrivilege srcPrif = new DummyPrivilege("PRIF");
srcPrif.addAttributeValue(DUMMY_PRIVILEGE_ATTRIBUTE_HR_ORGPATH, "UK");
// WHEN
dummyResourceHr.addPrivilege(srcFmfi);
dummyResourceHr.addPrivilege(srcVc);
dummyResourceHr.addPrivilege(srcPrif);
waitForTaskNextRunAssertSuccess(TASK_LIVE_SYNC_DUMMY_HR_OID, true);
// THEN
dumpOrgTree();
PrismObject<OrgType> uk = getAndAssertFunctionalOrg("UK");
assertNotNull("UK was not found", uk);
display("Org UK", uk);
assertHasOrg(uk, ORG_TOP_OID);
assertAssignedOrg(uk, ORG_TOP_OID);
assertSubOrgs(uk, 2);
assertSubOrgs(ORG_TOP_OID, 1);
assertGroupMembers(uk, "cn=DL-FMFI,ou=FMFI,ou=UK,dc=example,dc=com", "cn=DL-PRIF,ou=PRIF,ou=UK,dc=example,dc=com");
PrismObject<OrgType> fmfi = getAndAssertFunctionalOrg("FMFI");
assertNotNull("FMFI was not found", fmfi);
display("Org FMFI", fmfi);
assertHasOrg(fmfi, uk.getOid());
assertAssignedOrg(fmfi, uk.getOid());
assertSubOrgs(fmfi, 1);
assertGroupMembers(fmfi, "cn=DL-VC,ou=VC,ou=FMFI,ou=UK,dc=example,dc=com");
PrismObject<OrgType> prif = getAndAssertFunctionalOrg("PRIF");
assertNotNull("PRIF was not found", prif);
display("Org PRIF", prif);
assertHasOrg(prif, uk.getOid());
assertAssignedOrg(prif, uk.getOid());
assertSubOrgs(prif, 0);
assertNoGroupMembers(prif);
PrismObject<OrgType> vc = getAndAssertFunctionalOrg("VC");
assertNotNull("VC was not found", vc);
display("Org VC", vc);
assertHasOrg(vc, fmfi.getOid());
assertAssignedOrg(vc, fmfi.getOid());
assertSubOrgs(vc, 0);
assertNoGroupMembers(vc);
}
private 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);
}
private 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"));
}
@Test
public void test120MoveComputingCentre() throws Exception {
final String TEST_NAME = "test120MoveComputingCentre";
TestUtil.displayTestTile(this, TEST_NAME);
Task task = taskManager.createTaskInstance(TestUniversity.class.getName() + "." + TEST_NAME);
DummyPrivilege srcVc = dummyResourceHr.getPrivilegeByName("VC");
// WHEN
srcVc.replaceAttributeValue(DUMMY_PRIVILEGE_ATTRIBUTE_HR_ORGPATH, "UK:PRIF");
waitForTaskNextRunAssertSuccess(TASK_LIVE_SYNC_DUMMY_HR_OID, true, 999999999);
// THEN
dumpOrgTree();
PrismObject<OrgType> uk = getAndAssertFunctionalOrg("UK");
assertNotNull("UK was not found", uk);
display("Org UK", uk);
assertHasOrg(uk, ORG_TOP_OID);
assertAssignedOrg(uk, ORG_TOP_OID);
assertSubOrgs(uk, 2);
assertSubOrgs(ORG_TOP_OID, 1);
assertGroupMembers(uk, "cn=DL-FMFI,ou=FMFI,ou=UK,dc=example,dc=com", "cn=DL-PRIF,ou=PRIF,ou=UK,dc=example,dc=com");
PrismObject<OrgType> fmfi = getAndAssertFunctionalOrg("FMFI");
assertNotNull("FMFI was not found", fmfi);
display("Org FMFI", fmfi);
assertHasOrg(fmfi, uk.getOid());
assertAssignedOrg(fmfi, uk.getOid());
assertSubOrgs(fmfi, 0);
assertNoGroupMembers(fmfi);
PrismObject<OrgType> prif = getAndAssertFunctionalOrg("PRIF");
assertNotNull("PRIF was not found", prif);
display("Org PRIF", prif);
assertHasOrg(prif, uk.getOid());
assertAssignedOrg(prif, uk.getOid());
assertSubOrgs(prif, 1);
assertGroupMembers(prif, "cn=DL-VC,ou=VC,ou=PRIF,ou=UK,dc=example,dc=com");
PrismObject<OrgType> vc = getAndAssertFunctionalOrg("VC");
assertNotNull("VC was not found", vc);
display("Org VC", vc);
assertHasOrg(vc, prif.getOid());
assertAssignedOrg(vc, prif.getOid());
assertSubOrgs(vc, 0);
assertNoGroupMembers(vc);
}
// @Test
// public void test500ReconcileOpenDJDefault() throws Exception {
// final String TEST_NAME = "test500ReconcileOpenDJDefault";
// TestUtil.displayTestTile(this, TEST_NAME);
//
// // GIVEN
// Task task = createTask(TestInsurance.class.getName() + "." + TEST_NAME);
// OperationResult result = task.getResult();
// assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE);
//
// List<PrismObject<UserType>> users = modelService.searchObjects(UserType.class, null, null, task, result);
// display("Users before recon", users);
// assertUsers(15);
//
// reconciliationTaskResultListener.clear();
//
// // WHEN
// TestUtil.displayWhen(TEST_NAME);
// importObjectFromFile(TASK_RECON_OPENDJ_DEFAULT_SINGLE_FILE);
//
// // THEN
// TestUtil.displayThen(TEST_NAME);
//
// waitForTaskFinish(TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID, false);
//
// // THEN
// TestUtil.displayThen(TEST_NAME);
//
// reconciliationTaskResultListener.assertResult(RESOURCE_OPENDJ_OID, 0, 17, 0, 0);
//
// users = modelService.searchObjects(UserType.class, null, null, task, result);
// display("Users after recon", users);
//
// assertUsers(18);
//
// // Task result
// PrismObject<TaskType> reconTaskAfter = getTask(TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID);
// OperationResultType reconTaskResult = reconTaskAfter.asObjectable().getResult();
// display("Recon task result", reconTaskResult);
// TestUtil.assertSuccess(reconTaskResult);
// }
//
// @Test
// public void test502ReconcileOpenDJDefaultAgain() throws Exception {
// final String TEST_NAME = "test502ReconcileOpenDJDefaultAgain";
// TestUtil.displayTestTile(this, TEST_NAME);
//
// // GIVEN
// Task task = createTask(TestInsurance.class.getName() + "." + TEST_NAME);
// OperationResult result = task.getResult();
// assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE);
//
// assertUsers(18);
// reconciliationTaskResultListener.clear();
//
// // WHEN
// TestUtil.displayWhen(TEST_NAME);
// restartTask(TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID);
//
// // THEN
// TestUtil.displayThen(TEST_NAME);
//
// waitForTaskFinish(TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID, false);
//
// // THEN
// TestUtil.displayThen(TEST_NAME);
//
// reconciliationTaskResultListener.assertResult(RESOURCE_OPENDJ_OID, 0, 17, 0, 0);
//
// assertUsers(18);
//
// // Task result
// PrismObject<TaskType> reconTaskAfter = getTask(TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID);
// OperationResultType reconTaskResult = reconTaskAfter.asObjectable().getResult();
// display("Recon task result", reconTaskResult);
// TestUtil.assertSuccess(reconTaskResult);
// }
//
// @Test
// public void test510ReconcileOpenDJLdapGroup() throws Exception {
// final String TEST_NAME = "test510ReconcileOpenDJLdapGroup";
// TestUtil.displayTestTile(this, TEST_NAME);
//
// // GIVEN
// Task task = createTask(TestInsurance.class.getName() + "." + TEST_NAME);
// OperationResult result = task.getResult();
// assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE);
//
// List<PrismObject<UserType>> users = modelService.searchObjects(UserType.class, null, null, task, result);
// display("Users before recon", users);
// assertUsers(18);
//
// reconciliationTaskResultListener.clear();
//
// // WHEN
// TestUtil.displayWhen(TEST_NAME);
// importObjectFromFile(TASK_RECON_OPENDJ_LDAPGROUP_SINGLE_FILE);
//
// // THEN
// TestUtil.displayThen(TEST_NAME);
//
// waitForTaskFinish(TASK_RECON_OPENDJ_LDAPGROUP_SINGLE_OID, false);
//
// // THEN
// TestUtil.displayThen(TEST_NAME);
//
// reconciliationTaskResultListener.assertResult(RESOURCE_OPENDJ_OID, 0, 2, 0, 0);
//
// users = modelService.searchObjects(UserType.class, null, null, task, result);
// display("Users after recon", users);
//
// assertUsers(18);
//
// // Task result
// PrismObject<TaskType> reconTaskAfter = getTask(TASK_RECON_OPENDJ_LDAPGROUP_SINGLE_OID);
// OperationResultType reconTaskResult = reconTaskAfter.asObjectable().getResult();
// display("Recon task result", reconTaskResult);
// TestUtil.assertSuccess(reconTaskResult);
// }
//
// @Test
// public void test550ReconcileOpenDJAfterMembershipChange() throws Exception {
// final String TEST_NAME = "test550ReconcileOpenDJAfterMembershipChange";
// TestUtil.displayTestTile(this, TEST_NAME);
//
// // We manually remove Lemonhead from R_canibalism group
// // And check whether reconciliation re-adds him again
//
// // GIVEN
// Task task = createTask(TestInsurance.class.getName() + "." + TEST_NAME);
// OperationResult result = task.getResult();
// assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE);
//
// Collection<String> membersBeforeTest = openDJController.getGroupUniqueMembers(RESP_CANIBALISM_DN);
// System.out.println("group members before test = " + membersBeforeTest);
// assertTrue(RESP_CANIBALISM_DN + " does not contain " + ACCOUNT_LEMONHEAD_DN, membersBeforeTest.contains(ACCOUNT_LEMONHEAD_DN));
//
// openDJController.removeGroupUniqueMember(RESP_CANIBALISM_DN, ACCOUNT_LEMONHEAD_DN);
//
// System.out.println("group members after removal = " + openDJController.getGroupUniqueMembers(RESP_CANIBALISM_DN));
//
// openDJController.assertNoUniqueMember(RESP_CANIBALISM_DN, ACCOUNT_LEMONHEAD_DN);
//
// // WHEN
// TestUtil.displayWhen(TEST_NAME);
// restartTask(TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID);
//
// // THEN
// TestUtil.displayThen(TEST_NAME);
//
// waitForTaskFinish(TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID, false);
//
// // THEN
// TestUtil.displayThen(TEST_NAME);
//
// // Task result
// PrismObject<TaskType> reconTaskAfter = getTask(TASK_RECON_OPENDJ_DEFAULT_SINGLE_OID);
// OperationResultType reconTaskResult = reconTaskAfter.asObjectable().getResult();
// display("Recon task result", reconTaskResult);
// TestUtil.assertSuccess(reconTaskResult);
//
// Collection<String> membersAfterTest = openDJController.getGroupUniqueMembers(RESP_CANIBALISM_DN);
// System.out.println("group members after test = " + membersAfterTest);
// assertTrue(RESP_CANIBALISM_DN + " does not contain " + ACCOUNT_LEMONHEAD_DN, membersAfterTest.contains(ACCOUNT_LEMONHEAD_DN.toLowerCase())); // ...it seems to get lowercased during the reconciliation
// }
private PrismObject<OrgType> getAndAssertFunctionalOrg(String orgName) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, DirectoryException {
PrismObject<OrgType> org = getOrg(orgName);
PrismAsserts.assertPropertyValue(org, OrgType.F_ORG_TYPE, "functional");
assertAssignedRole(org, ROLE_META_ORG_OID);
String ouOid = getLinkRefOid(org, RESOURCE_OPENDJ_OID, ShadowKindType.GENERIC, "org-ou");
PrismObject<ShadowType> ouShadow = getShadowModel(ouOid);
display("Org " + orgName + " OU shadow", ouShadow);
// TODO assert shadow content
String groupOid = getLinkRefOid(org, RESOURCE_OPENDJ_OID, ShadowKindType.ENTITLEMENT, "org-group");
PrismObject<ShadowType> groupShadow = getShadowModel(groupOid);
display("Org "+orgName+" group shadow", groupShadow);
// TODO assert shadow content
Entry ouEntry = openDJController.searchSingle("ou="+orgName);
assertNotNull("No ou LDAP entry for "+orgName, ouEntry);
display("OU entry", ouEntry);
openDJController.assertObjectClass(ouEntry, "organizationalUnit");
Entry groupEntry = openDJController.searchSingle("cn=DL-"+orgName);
assertNotNull("No group LDAP entry for "+orgName, groupEntry);
display("OU GROUP entry", groupEntry);
openDJController.assertObjectClass(groupEntry, "groupOfUniqueNames");
return org;
}
private 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;
}
private void dumpOrgTree() throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException {
display("Org tree", dumpOrgTree(ORG_TOP_OID));
}
}