package com.evolveum.midpoint.testing.story; /* * Copyright (c) 2017 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. */ 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; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.xml.namespace.QName; 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 com.evolveum.icf.dummy.resource.DummyAccount; import com.evolveum.icf.dummy.resource.DummyObjectClass; 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.constants.MidPointConstants; 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.IntegrationTestTools; 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.AssignmentPolicyEnforcementType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; 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.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** * @author Radovan Semancik * */ @ContextConfiguration(locations = { "classpath:ctx-story-test-main.xml" }) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestDependencyRename extends AbstractStoryTest { public static final File TEST_DIR = new File(MidPointTestConstants.TEST_RESOURCES_DIR, "dependency-rename"); public static final File OBJECT_TEMPLATE_USER_FILE = new File(TEST_DIR, "object-template-user.xml"); public static final String OBJECT_TEMPLATE_USER_OID = "10000000-0000-0000-0000-000000000222"; protected static final File RESOURCE_DUMMY_PHONEBOOK_FILE = new File(TEST_DIR, "resource-dummy-phonebook.xml"); protected static final String RESOURCE_DUMMY_PHONEBOOK_ID = "phonebook"; protected static final String RESOURCE_DUMMY_PHONEBOOK_OID = "10000000-0000-0000-0000-000000000001"; protected static final String RESOURCE_DUMMY_PHONEBOOK_NAMESPACE = MidPointConstants.NS_RI; 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; public static final File ROLE_BASIC_FILE = new File(TEST_DIR, "role-basic.xml"); public static final String ROLE_BASIC_OID = "10000000-0000-0000-0000-000000000601"; private static final String USER_HERMAN_USERNAME = "ht"; private static final String USER_HERMAN_USERNAME_FINAL = "htoothrot"; private static final String USER_HERMAN_GIVEN_NAME = "Herman"; private static final String USER_HERMAN_FAMILY_NAME = "Toothrot"; private static final String USER_HERMAN_USERNAME_MARLEY = "hmarley"; private static final String USER_HERMAN_FAMILY_NAME_MARLEY = "Marley"; private static final String USER_CAPSIZE_USERNAME = "kc"; private static final String USER_CAPSIZE_USERNAME_FINAL = "kcapsize"; private static final String USER_CAPSIZE_GIVEN_NAME = "Kate"; private static final String USER_CAPSIZE_FAMILY_NAME = "Capsize"; protected ResourceType resourceOpenDjType; protected PrismObject<ResourceType> resourceOpenDj; private String userHermanOid; private String accountHermanPhonebookOid; private String accountHermanOpenDjOid; @Override protected void startResources() throws Exception { openDJController.startCleanServer(); } @AfterClass public static void stopResources() throws Exception { openDJController.stop(); } @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); // Resources initDummyResource(RESOURCE_DUMMY_PHONEBOOK_ID, RESOURCE_DUMMY_PHONEBOOK_FILE, RESOURCE_DUMMY_PHONEBOOK_OID, initTask, initResult); resourceOpenDj = importAndGetObjectFromFile(ResourceType.class, RESOURCE_OPENDJ_FILE, RESOURCE_OPENDJ_OID, initTask, initResult); resourceOpenDjType = resourceOpenDj.asObjectable(); openDJController.setResource(resourceOpenDj); // Object Templates importObjectFromFile(OBJECT_TEMPLATE_USER_FILE, initResult); setDefaultUserTemplate(OBJECT_TEMPLATE_USER_OID); // Role importObjectFromFile(ROLE_BASIC_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_PHONEBOOK_OID, task); TestUtil.assertSuccess(testResultHr); OperationResult testResultOpenDj = modelService.testResource(RESOURCE_OPENDJ_OID, task); TestUtil.assertSuccess(testResultOpenDj); } @Test public void test100AddUserHerman() throws Exception { final String TEST_NAME = "test100AddUserHerman"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUserDefinition().instantiate(); UserType userType = userBefore.asObjectable(); userType.setName(createPolyStringType(USER_HERMAN_USERNAME)); userType.setGivenName(createPolyStringType(USER_HERMAN_GIVEN_NAME)); userType.setFamilyName(createPolyStringType(USER_HERMAN_FAMILY_NAME)); display("User before", userBefore); // WHEN addObject(userBefore, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = findUserByUsername(USER_HERMAN_USERNAME); assertNotNull("No herman user", userAfter); userHermanOid = userAfter.getOid(); display("User after", userAfter); assertUserHerman(userAfter, USER_HERMAN_USERNAME); assertNoAssignments(userAfter); } @Test public void test110HermanAssignRoleBasic() throws Exception { final String TEST_NAME = "test110HermanAssignRoleBasic"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN assignRole(userHermanOid, ROLE_BASIC_OID, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = getUser(userHermanOid); assertNotNull("No herman user", userAfter); userHermanOid = userAfter.getOid(); display("User after", userAfter); assertUserHerman(userAfter, USER_HERMAN_USERNAME_FINAL); assertAssignedRole(userAfter, ROLE_BASIC_OID); assertAssignments(userAfter, 1); assertLinks(userAfter, 2); accountHermanPhonebookOid = getLinkRefOid(userAfter, RESOURCE_DUMMY_PHONEBOOK_OID); PrismObject<ShadowType> shadowPhonebook = getShadowModel(accountHermanPhonebookOid); display("Shadow phonebook after", shadowPhonebook); assertShadowSecondaryIdentifier(shadowPhonebook, USER_HERMAN_USERNAME_FINAL, getDummyResourceType(RESOURCE_DUMMY_PHONEBOOK_ID), null); accountHermanOpenDjOid = getLinkRefOid(userAfter, RESOURCE_OPENDJ_OID); PrismObject<ShadowType> shadowOpenDj = getShadowModel(accountHermanOpenDjOid); display("Shadow opendj after", shadowOpenDj); assertShadowSecondaryIdentifier(shadowOpenDj, openDJController.getAccountDn(USER_HERMAN_USERNAME_FINAL), resourceOpenDjType, caseIgnoreMatchingRule); } @Test public void test112HermanRename() throws Exception { final String TEST_NAME = "test112HermanRename"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserReplace(userHermanOid, UserType.F_FAMILY_NAME, task, result, createPolyString(USER_HERMAN_FAMILY_NAME_MARLEY)); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = getUser(userHermanOid); assertNotNull("No herman user", userAfter); userHermanOid = userAfter.getOid(); display("User after", userAfter); assertUser(userAfter, USER_HERMAN_USERNAME_MARLEY, USER_HERMAN_GIVEN_NAME, USER_HERMAN_FAMILY_NAME_MARLEY); assertAssignedRole(userAfter, ROLE_BASIC_OID); assertAssignments(userAfter, 1); assertLinks(userAfter, 2); accountHermanPhonebookOid = getLinkRefOid(userAfter, RESOURCE_DUMMY_PHONEBOOK_OID); PrismObject<ShadowType> shadowPhonebook = getShadowModel(accountHermanPhonebookOid); display("Shadow phonebook after", shadowPhonebook); assertShadowSecondaryIdentifier(shadowPhonebook, USER_HERMAN_USERNAME_MARLEY, getDummyResourceType(RESOURCE_DUMMY_PHONEBOOK_ID), null); accountHermanOpenDjOid = getLinkRefOid(userAfter, RESOURCE_OPENDJ_OID); PrismObject<ShadowType> shadowOpenDj = getShadowModel(accountHermanOpenDjOid); display("Shadow opendj after", shadowOpenDj); assertShadowSecondaryIdentifier(shadowOpenDj, openDJController.getAccountDn(USER_HERMAN_USERNAME_MARLEY), resourceOpenDjType, caseIgnoreMatchingRule); } @Test public void test120AddUserCapsizeWithBasicRole() throws Exception { final String TEST_NAME = "test120AddUserCapsizeWithBasicRole"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUserDefinition().instantiate(); UserType userType = userBefore.asObjectable(); userType.setName(createPolyStringType(USER_CAPSIZE_USERNAME)); userType.setGivenName(createPolyStringType(USER_CAPSIZE_GIVEN_NAME)); userType.setFamilyName(createPolyStringType(USER_CAPSIZE_FAMILY_NAME)); userType.beginAssignment().targetRef(ROLE_BASIC_OID, RoleType.COMPLEX_TYPE).end(); display("User before", userBefore); // WHEN addObject(userBefore, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); String userCapsizeOid = userBefore.getOid(); PrismObject<UserType> userAfter = getUser(userCapsizeOid); assertNotNull("No user", userAfter); display("User after", userAfter); assertUser(userAfter, USER_CAPSIZE_USERNAME_FINAL, USER_CAPSIZE_GIVEN_NAME, USER_CAPSIZE_FAMILY_NAME); assertLinks(userAfter, 2); String accountPhonebookOid = getLinkRefOid(userAfter, RESOURCE_DUMMY_PHONEBOOK_OID); PrismObject<ShadowType> shadowPhonebook = getShadowModel(accountPhonebookOid); display("Shadow phonebook after", shadowPhonebook); assertShadowSecondaryIdentifier(shadowPhonebook, USER_CAPSIZE_USERNAME_FINAL, getDummyResourceType(RESOURCE_DUMMY_PHONEBOOK_ID), null); String accountOpenDjOid = getLinkRefOid(userAfter, RESOURCE_OPENDJ_OID); PrismObject<ShadowType> shadowOpenDj = getShadowModel(accountOpenDjOid); display("Shadow opendj after", shadowOpenDj); assertShadowSecondaryIdentifier(shadowOpenDj, openDJController.getAccountDn(USER_CAPSIZE_USERNAME_FINAL), resourceOpenDjType, caseIgnoreMatchingRule); } protected void assertUserHerman(PrismObject<UserType> user, String username) { assertUser(user, username, USER_HERMAN_GIVEN_NAME, USER_HERMAN_FAMILY_NAME); } protected void assertUser(PrismObject<UserType> user, String username, String firstName, String lastName) { assertUser(user, user.getOid(), username, firstName + " " + lastName, firstName, lastName); } }