/* * Copyright (c) 2010-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.model.intest; import com.evolveum.midpoint.notifications.api.transports.Message; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalMonitor; 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.IntegrationTestTools; import com.evolveum.midpoint.test.ProvisioningScriptSpec; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.testng.AssertJUnit; import org.testng.annotations.Test; import javax.xml.datatype.XMLGregorianCalendar; import java.io.File; import java.util.Collection; import java.util.Collections; import java.util.List; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.*; /** * @author mederly * */ @ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestNotifications extends AbstractInitializedModelIntegrationTest { public static final File TEST_DIR = new File("src/test/resources/notifications"); public static final File SYSTEM_CONFIGURATION_FILE = new File(TEST_DIR, "system-configuration.xml"); private String accountJackOid; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); InternalMonitor.reset(); } @Override protected File getSystemConfigurationFile() { return SYSTEM_CONFIGURATION_FILE; } @Test public void test100ModifyUserAddAccount() throws Exception { final String TEST_NAME = "test100ModifyUserAddAccount"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + ".test100ModifyUserAddAccount"); task.setChannel(SchemaConstants.CHANNEL_GUI_USER_URI); OperationResult result = task.getResult(); preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserAddAccount(USER_JACK_OID, ACCOUNT_JACK_DUMMY_FILE, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); assertShadowFetchOperationCountIncrement(0); // Check accountRef PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); assertUserJack(userJack); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); ObjectReferenceType accountRefType = userJackType.getLinkRef().get(0); accountJackOid = accountRefType.getOid(); assertFalse("No accountRef oid", StringUtils.isBlank(accountJackOid)); PrismReferenceValue accountRefValue = accountRefType.asReferenceValue(); assertEquals("OID mismatch in accountRefValue", accountJackOid, accountRefValue.getOid()); assertNull("Unexpected object in accountRefValue", accountRefValue.getObject()); // Check shadow PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); assertEnableTimestampShadow(accountShadow, startTime, endTime); // Check account PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Jack Sparrow"); // Check account in dummy resource assertDefaultDummyAccount("jack", "Jack Sparrow", true); assertDummyScriptsAdd(userJack, accountModel, getDummyResourceType()); notificationManager.setDisabled(true); // Check notifications display("Dummy transport messages", dummyTransport); checkDummyTransportMessages("accountPasswordNotifier", 1); checkDummyTransportMessages("userPasswordNotifier", 0); checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 1); checkDummyTransportMessages("simpleUserNotifier", 0); checkDummyTransportMessages("simpleUserNotifier-ADD", 0); List<Message> pwdMessages = dummyTransport.getMessages("dummy:accountPasswordNotifier"); Message pwdMessage = pwdMessages.get(0); // number of messages was already checked assertEquals("Invalid list of recipients", Collections.singletonList("recipient@evolveum.com"), pwdMessage.getTo()); assertEquals("Wrong message body", "Password for account jack on Dummy Resource is: deadmentellnotales", pwdMessage.getBody()); List<Message> addMessages = dummyTransport.getMessages("dummy:simpleAccountNotifier-ADD-SUCCESS"); Message addMessage = addMessages.get(0); // number of messages was already checked assertEquals("Invalid list of recipients", Collections.singletonList("recipient@evolveum.com"), addMessage.getTo()); assertEquals("Wrong message body", "Notification about account-related operation\n" + "\n" + "Owner: Jack Sparrow (jack, oid c0c010c0-d34d-b33f-f00d-111111111111)\n" + "Resource: Dummy Resource (oid 10000000-0000-0000-0000-000000000004)\n" + "\n" + "An account has been successfully created on the resource with attributes:\n" + " - UID: jack\n" + " - Username: jack\n" + " - Location: Caribbean\n" + " - Quote: Arr!\n" + " - Drink: rum\n" + " - Weapon: rum\n" + " - Full Name: Jack Sparrow\n" + " - Password:\n" + " - value: (protected string)\n" + " - Administrative status: ENABLED\n" + "\n" + "Channel: http://midpoint.evolveum.com/xml/ns/public/gui/channels-3#user", addMessage.getBody()); assertSteadyResources(); } @Test public void test119ModifyUserDeleteAccount() throws Exception { final String TEST_NAME = "test119ModifyUserDeleteAccount"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); PrismObject<ShadowType> account = PrismTestUtil.parseObject(ACCOUNT_JACK_DUMMY_FILE); account.setOid(accountJackOid); ObjectDelta<UserType> userDelta = ObjectDelta.createEmptyModifyDelta(UserType.class, USER_JACK_OID, prismContext); ReferenceDelta accountDelta = ReferenceDelta.createModificationDelete(UserType.F_LINK_REF, getUserDefinition(), account); userDelta.addModification(accountDelta); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta); // WHEN TestUtil.displayWhen(TEST_NAME); modelService.executeChanges(deltas, null, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess("executeChanges result", result, 2); assertShadowFetchOperationCountIncrement(0); // Check accountRef PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); assertUserJack(userJack); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of linkRefs", 0, userJackType.getLinkRef().size()); // Check is shadow is gone try { PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); AssertJUnit.fail("Shadow "+accountJackOid+" still exists"); } catch (ObjectNotFoundException e) { // This is OK } // Check if dummy resource account is gone assertNoDummyAccount("jack"); assertDummyScriptsDelete(); // Check notifications display("Notifications", dummyTransport); notificationManager.setDisabled(true); checkDummyTransportMessages("accountPasswordNotifier", 0); checkDummyTransportMessages("userPasswordNotifier", 0); checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 1); checkDummyTransportMessages("simpleUserNotifier", 0); checkDummyTransportMessages("simpleUserNotifier-ADD", 0); String expected = "Notification about account-related operation\n" + "\n" + "Owner: Jack Sparrow (jack, oid c0c010c0-d34d-b33f-f00d-111111111111)\n" + "Resource: Dummy Resource (oid 10000000-0000-0000-0000-000000000004)\n" + "Account: jack\n" + "\n" + "The account has been successfully removed from the resource.\n" + "\n" + "Channel: "; assertEquals("Wrong message body", expected, dummyTransport.getMessages("dummy:simpleAccountNotifier-DELETE-SUCCESS").get(0).getBody()); assertSteadyResources(); } @Test public void test131ModifyUserJackAssignAccount() throws Exception { final String TEST_NAME="test131ModifyUserJackAssignAccount"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); preTestCleanup(AssignmentPolicyEnforcementType.FULL); XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // WHEN TestUtil.displayWhen(TEST_NAME); assignAccount(USER_JACK_OID, RESOURCE_DUMMY_OID, null, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess("executeChanges result", result); XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); assertShadowFetchOperationCountIncrement(0); PrismObject<UserType> userJack = getUser(USER_JACK_OID); display("User after change execution", userJack); assertUserJack(userJack); assertAssignedAccount(userJack, RESOURCE_DUMMY_OID); assertAssignments(userJack, 1); accountJackOid = getSingleLinkOid(userJack); // Check shadow PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); assertEnableTimestampShadow(accountShadow, startTime, endTime); // Check account PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Jack Sparrow"); assertEnableTimestampShadow(accountModel, startTime, endTime); // Check account in dummy resource assertDefaultDummyAccount("jack", "Jack Sparrow", true); assertDummyScriptsAdd(userJack, accountModel, getDummyResourceType()); // Check notifications display("Notifications", dummyTransport); notificationManager.setDisabled(true); checkDummyTransportMessages("accountPasswordNotifier", 1); checkDummyTransportMessages("userPasswordNotifier", 0); checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 1); checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); checkDummyTransportMessages("simpleUserNotifier", 1); checkDummyTransportMessages("simpleUserNotifier-ADD", 0); assertSteadyResources(); String expected = "Notification about user-related operation (status: SUCCESS)\n" + "\n" + "User: Jack Sparrow (jack, oid c0c010c0-d34d-b33f-f00d-111111111111)\n" + "\n" + "The user record was modified. Modified attributes are:\n" + " - Assignment:\n" + " - ADD: \n" + " - Construction:\n" + " - kind: ACCOUNT\n" + " - resourceRef: Dummy Resource (resource)\n" + "\n" + "Channel: "; assertEquals("Wrong message body", expected, dummyTransport.getMessages("dummy:simpleUserNotifier").get(0).getBody()); } // // /** // * Modify the account. Some of the changes should be reflected back to the user by inbound mapping. // */ // @Test // public void test132ModifyAccountJackDummy() throws Exception { // final String TEST_NAME = "test132ModifyAccountJackDummy"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<ShadowType> accountDelta = ObjectDelta.createModificationReplaceProperty(ShadowType.class, // accountJackOid, dummyResourceCtl.getAttributeFullnamePath(), prismContext, "Cpt. Jack Sparrow"); // accountDelta.addModificationReplaceProperty( // dummyResourceCtl.getAttributePath(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME), // "Queen Anne's Revenge"); // deltas.add(accountDelta); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // There is strong mapping. Complete account is fetched. // assertShadowFetchOperationCountIncrement(1); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // // Fullname inbound mapping is not used because it is weak // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // // ship inbound mapping is used, it is strong // assertEquals("Wrong user locality (orig)", "The crew of Queen Anne's Revenge", // userJack.asObjectable().getOrganizationalUnit().iterator().next().getOrig()); // assertEquals("Wrong user locality (norm)", "the crew of queen annes revenge", // userJack.asObjectable().getOrganizationalUnit().iterator().next().getNorm()); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // // // Check account // // All the changes should be reflected to the account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Cpt. Jack Sparrow"); // PrismAsserts.assertPropertyValue(accountModel, // dummyResourceCtl.getAttributePath(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME), // "Queen Anne's Revenge"); // // // Check account in dummy resource // assertDefaultDummyAccount(USER_JACK_USERNAME, "Cpt. Jack Sparrow", true); // assertDummyAccountAttribute(null, USER_JACK_USERNAME, DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME, // "Queen Anne's Revenge"); // // assertDummyScriptsModify(userJack); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(3); // dummyAuditService.assertAnyRequestDeltas(); // // dummyAuditService.assertExecutionDeltas(0, 1); // dummyAuditService.assertHasDelta(0, ChangeType.MODIFY, ShadowType.class); // dummyAuditService.assertOldValue(0, ChangeType.MODIFY, ShadowType.class, // dummyResourceCtl.getAttributeFullnamePath(), "Jack Sparrow"); //// dummyAuditService.assertOldValue(0, ChangeType.MODIFY, ShadowType.class, //// dummyResourceCtl.getAttributePath(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME)); // // dummyAuditService.assertExecutionDeltas(1, 1); // dummyAuditService.assertHasDelta(1, ChangeType.MODIFY, UserType.class); // // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertSteadyResources(); // } // // /** // * MID-3080 // */ // @Test // public void test135ModifyUserJackAssignAccountAgain() throws Exception { // final String TEST_NAME="test135ModifyUserJackAssignAccountAgain"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // // WHEN // TestUtil.displayWhen(TEST_NAME); // assignAccount(USER_JACK_OID, RESOURCE_DUMMY_OID, null, task, result); // // // THEN // TestUtil.displayThen(TEST_NAME); // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack); // assertAssignedAccount(userJack, RESOURCE_DUMMY_OID); // assertAssignments(userJack, 1); // // accountJackOid = getSingleLinkOid(userJack); // // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Cpt. Jack Sparrow"); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Cpt. Jack Sparrow", true); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(1); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertSteadyResources(); // } // // @Test // public void test139ModifyUserJackUnassignAccount() throws Exception { // final String TEST_NAME = "test139ModifyUserJackUnassignAccount"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<UserType> accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, false); // deltas.add(accountAssignmentUserDelta); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // // Check accountRef // assertUserNoAccountRefs(userJack); // // // Check is shadow is gone // assertNoShadow(accountJackOid); // // // Check if dummy resource account is gone // assertNoDummyAccount("jack"); // // assertDummyScriptsDelete(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(2); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.DELETE, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 1); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertSteadyResources(); // } // // /** // * Assignment enforcement is set to POSITIVE for this test. The account should be added. // */ // @Test // public void test141ModifyUserJackAssignAccountPositiveEnforcement() throws Exception { // final String TEST_NAME = "test141ModifyUserJackAssignAccountPositiveEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<UserType> accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, true); // deltas.add(accountAssignmentUserDelta); // // // Let's break the delta a bit. Projector should handle this anyway // breakAssignmentDelta(deltas); // // // This is a second time we assigned this account. Therefore all the scripts in mapping should already // // be compiled ... check this. // rememberScriptCompileCount(); // // XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // assertEnableTimestampShadow(accountShadow, startTime, endTime); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Jack Sparrow"); // assertEnableTimestampShadow(accountModel, startTime, endTime); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Jack Sparrow", true); // // assertDummyScriptsAdd(userJack, accountModel, resourceDummyType); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.ADD, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 1); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // // This is a second time we assigned this account. Therefore all the scripts in mapping should already // // be compiled ... check this. // assertScriptCompileIncrement(0); // // assertSteadyResources(); // } // // /** // * Assignment enforcement is set to POSITIVE for this test. The account should remain as it is. // */ // @Test // public void test148ModifyUserJackUnassignAccountPositiveEnforcement() throws Exception { // final String TEST_NAME = "test148ModifyUserJackUnassignAccountPositiveEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() // + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<UserType> accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, false); // deltas.add(accountAssignmentUserDelta); // // // Let's break the delta a bit. Projector should handle this anyway // breakAssignmentDelta(deltas); // // //change resource assigment policy to be positive..if they are not applied by projector, the test will fail // assumeResourceAssigmentPolicy(RESOURCE_DUMMY_OID, AssignmentPolicyEnforcementType.POSITIVE, false); // // the previous command changes resource, therefore let's explicitly re-read it before test // // to refresh the cache and not affect the performance results (monitor). // modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); // assertResourceSchemaParseCountIncrement(1); // // // WHEN // TestUtil.displayWhen(TEST_NAME); // modelService.executeChanges(deltas, null, task, result); // // // THEN // TestUtil.displayThen(TEST_NAME); // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // There is strong mapping. Complete account is fetched. // assertShadowFetchOperationCountIncrement(1); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack); // assertLinked(userJack, accountJackOid); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Jack Sparrow"); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Jack Sparrow", true); // // assertNoProvisioningScripts(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(1); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // // // return resource to the previous state..delete assignment enforcement to prevent next test to fail.. // deleteResourceAssigmentPolicy(RESOURCE_DUMMY_OID, AssignmentPolicyEnforcementType.POSITIVE, false); // // the previous command changes resource, therefore let's explicitly re-read it before test // // to refresh the cache and not affect the performance results (monitor). // modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); // assertResourceSchemaParseCountIncrement(1); // } // // /** // * Assignment enforcement is set to POSITIVE for this test as it was for the previous test. // * Now we will explicitly delete the account. // */ // @Test // public void test149ModifyUserJackDeleteAccount() throws Exception { // final String TEST_NAME = "test149ModifyUserJackDeleteAccount"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); // // ObjectDelta<UserType> userDelta = ObjectDelta.createEmptyModifyDelta(UserType.class, USER_JACK_OID, prismContext); // PrismReferenceValue accountRefVal = new PrismReferenceValue(); // accountRefVal.setOid(accountJackOid); // ReferenceDelta accountRefDelta = ReferenceDelta.createModificationDelete(UserType.F_LINK_REF, getUserDefinition(), accountJackOid); // userDelta.addModification(accountRefDelta); // // ObjectDelta<ShadowType> accountDelta = ObjectDelta.createDeleteDelta(ShadowType.class, accountJackOid, prismContext); // // Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta, accountDelta); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // // Check accountRef // assertUserNoAccountRefs(userJack); // // // Check is shadow is gone // assertNoShadow(accountJackOid); // // // Check if dummy resource account is gone // assertNoDummyAccount("jack"); // // assertDummyScriptsDelete(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(2); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(2); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.DELETE, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 1); // checkDummyTransportMessages("simpleUserNotifier", 0); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // /** // * Assignment enforcement is set to RELATTIVE for this test. The account should be added. // */ // @Test // public void test151ModifyUserJackAssignAccountRelativeEnforcement() throws Exception { // final String TEST_NAME = "test151ModifyUserJackAssignAccountRelativeEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.RELATIVE); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<UserType> accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, true); // deltas.add(accountAssignmentUserDelta); // // // Let's break the delta a bit. Projector should handle this anyway // breakAssignmentDelta(deltas); // // XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // assertEnableTimestampShadow(accountShadow, startTime, endTime); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Jack Sparrow"); // assertEnableTimestampShadow(accountModel, startTime, endTime); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Jack Sparrow", true); // // assertDummyScriptsAdd(userJack, accountModel, resourceDummyType); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.ADD, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 1); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // /** // * Assignment enforcement is set to RELATIVE for this test. The account should be gone. // */ // @Test // public void test158ModifyUserJackUnassignAccountRelativeEnforcement() throws Exception { // final String TEST_NAME = "test158ModifyUserJackUnassignAccountRelativeEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() // + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.RELATIVE); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<UserType> accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, false); // deltas.add(accountAssignmentUserDelta); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // // Check accountRef // assertUserNoAccountRefs(userJack); // // // Check is shadow is gone // assertNoShadow(accountJackOid); // // // Check if dummy resource account is gone // assertNoDummyAccount("jack"); // // assertDummyScriptsDelete(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(2); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.DELETE, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 1); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // /** // * Assignment enforcement is set to NONE for this test. // */ // @Test // public void test161ModifyUserJackAssignAccountNoneEnforcement() throws Exception { // final String TEST_NAME = "test161ModifyUserJackAssignAccountNoneEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.NONE); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<UserType> accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, true); // deltas.add(accountAssignmentUserDelta); // // // Let's break the delta a bit. Projector should handle this anyway // breakAssignmentDelta(deltas); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // // Check accountRef // assertUserNoAccountRefs(userJack); // // // Check is shadow is gone // assertNoShadow(accountJackOid); // // // Check if dummy resource account is gone // assertNoDummyAccount("jack"); // // assertDummyScriptsNone(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(2); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(1); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test163ModifyUserJackAddAccountNoneEnforcement() throws Exception { // final String TEST_NAME = "test163ModifyUserJackAddAccountNoneEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.NONE); // // PrismObject<ShadowType> account = PrismTestUtil.parseObject(ACCOUNT_JACK_DUMMY_FILE); // // ObjectDelta<UserType> userDelta = ObjectDelta.createEmptyModifyDelta(UserType.class, USER_JACK_OID, prismContext); // PrismReferenceValue accountRefVal = new PrismReferenceValue(); // accountRefVal.setObject(account); // ReferenceDelta accountDelta = ReferenceDelta.createModificationAdd(UserType.F_LINK_REF, getUserDefinition(), accountRefVal); // userDelta.addModification(accountDelta); // Collection<ObjectDelta<? extends ObjectType>> deltas = (Collection)MiscUtil.createCollection(userDelta); // // dummyAuditService.clear(); // dummyTransport.clearMessages(); // notificationManager.setDisabled(false); // // XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // assertEnableTimestampShadow(accountShadow, startTime, endTime); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Jack Sparrow"); // assertEnableTimestampShadow(accountModel, startTime, endTime); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Jack Sparrow", true); // // assertDummyScriptsAdd(userJack, accountModel, resourceDummyType); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(2); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.ADD, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // notificationManager.setDisabled(true); // // // Check notifications // checkDummyTransportMessages("accountPasswordNotifier", 1); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 1); // checkDummyTransportMessages("simpleUserNotifier", 0); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test164ModifyUserJackUnassignAccountNoneEnforcement() throws Exception { // final String TEST_NAME = "test164ModifyUserJackUnassignAccountNoneEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() // + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.NONE); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<UserType> accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, false); // deltas.add(accountAssignmentUserDelta); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // Strong mappings // assertShadowFetchOperationCountIncrement(1); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Jack Sparrow"); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Jack Sparrow", true); // // assertDummyScriptsNone(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(1); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // notificationManager.setDisabled(true); // // // Check notifications // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test169ModifyUserJackDeleteAccountNoneEnforcement() throws Exception { // final String TEST_NAME = "test169ModifyUserJackDeleteAccountNoneEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.NONE); // // ObjectDelta<UserType> userDelta = ObjectDelta.createEmptyModifyDelta(UserType.class, USER_JACK_OID, prismContext); // PrismReferenceValue accountRefVal = new PrismReferenceValue(); // accountRefVal.setOid(accountJackOid); // ReferenceDelta accountRefDelta = ReferenceDelta.createModificationDelete(UserType.F_LINK_REF, getUserDefinition(), accountJackOid); // userDelta.addModification(accountRefDelta); // // ObjectDelta<ShadowType> accountDelta = ObjectDelta.createDeleteDelta(ShadowType.class, accountJackOid, prismContext); // // Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta, accountDelta); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // // Check accountRef // assertUserNoAccountRefs(userJack); // // // Check is shadow is gone // assertNoShadow(accountJackOid); // // // Check if dummy resource account is gone // assertNoDummyAccount("jack"); // // assertDummyScriptsDelete(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(2); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(2); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.DELETE, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 1); // checkDummyTransportMessages("simpleUserNotifier", 0); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test180ModifyUserAddAccountFullEnforcement() throws Exception { // final String TEST_NAME = "test180ModifyUserAddAccountFullEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // PrismObject<ShadowType> account = PrismTestUtil.parseObject(ACCOUNT_JACK_DUMMY_FILE); // // ObjectDelta<UserType> userDelta = ObjectDelta.createEmptyModifyDelta(UserType.class, USER_JACK_OID, prismContext); // PrismReferenceValue accountRefVal = new PrismReferenceValue(); // accountRefVal.setObject(account); // ReferenceDelta accountDelta = ReferenceDelta.createModificationAdd(UserType.F_LINK_REF, getUserDefinition(), accountRefVal); // userDelta.addModification(accountDelta); // Collection<ObjectDelta<? extends ObjectType>> deltas = (Collection)MiscUtil.createCollection(userDelta); // // try { // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // AssertJUnit.fail("Unexpected executeChanges success"); // } catch (PolicyViolationException e) { // // This is expected // display("Expected exception", e); // } // // // THEN // result.computeStatus(); // TestUtil.assertFailure("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // // Check accountRef // assertUserNoAccountRefs(userJack); // // // Check that shadow was not created // assertNoShadow(accountJackOid); // // // Check that dummy resource account was not created // assertNoDummyAccount("jack"); // // assertNoProvisioningScripts(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(0, 0); // dummyAuditService.assertExecutionOutcome(OperationResultStatus.FATAL_ERROR); // dummyAuditService.assertTarget(USER_JACK_OID); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test182ModifyUserAddAndAssignAccountPositiveEnforcement() throws Exception { // final String TEST_NAME = "test182ModifyUserAddAndAssignAccountPositiveEnforcement"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); // // PrismObject<ShadowType> account = PrismTestUtil.parseObject(ACCOUNT_JACK_DUMMY_FILE); // // ObjectDelta<UserType> userDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, true); // PrismReferenceValue accountRefVal = new PrismReferenceValue(); // accountRefVal.setObject(account); // ReferenceDelta accountDelta = ReferenceDelta.createModificationAdd(UserType.F_LINK_REF, getUserDefinition(), accountRefVal); // userDelta.addModification(accountDelta); // Collection<ObjectDelta<? extends ObjectType>> deltas = (Collection)MiscUtil.createCollection(userDelta); // // XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); // assertShadowFetchOperationCountIncrement(0); // // Check accountRef // PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); // assertUserJack(userJack); // UserType userJackType = userJack.asObjectable(); // assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); // ObjectReferenceType accountRefType = userJackType.getLinkRef().get(0); // accountJackOid = accountRefType.getOid(); // assertFalse("No accountRef oid", StringUtils.isBlank(accountJackOid)); // PrismReferenceValue accountRefValue = accountRefType.asReferenceValue(); // assertEquals("OID mismatch in accountRefValue", accountJackOid, accountRefValue.getOid()); // assertNull("Unexpected object in accountRefValue", accountRefValue.getObject()); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // assertEnableTimestampShadow(accountShadow, startTime, endTime); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Jack Sparrow"); // assertEnableTimestampShadow(accountModel, startTime, endTime); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Jack Sparrow", true); // // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // assertDummyScriptsAdd(userJack, accountModel, resourceDummyType); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.ADD, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // /** // * Assignment enforcement is set to POSITIVE for this test as it was for the previous test. // * Now we will explicitly delete the account. // */ // @Test // public void test189ModifyUserJackUnassignAndDeleteAccount() throws Exception { // TestUtil.displayTestTile(this, "test189ModifyUserJackUnassignAndDeleteAccount"); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + ".test149ModifyUserJackUnassignAccount"); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); // // ObjectDelta<UserType> userDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, false); // // Explicit unlink is not needed here, it should work without it // // ObjectDelta<ShadowType> accountDelta = ObjectDelta.createDeleteDelta(ShadowType.class, accountJackOid, prismContext); // // Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta, accountDelta); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // // Check accountRef // assertUserNoAccountRefs(userJack); // // // Check is shadow is gone // assertNoShadow(accountJackOid); // // // Check if dummy resource account is gone // assertNoDummyAccount("jack"); // // assertDummyScriptsDelete(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(2); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.DELETE, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // /** // * We try to both assign an account and modify that account in one operation. // * Some changes should be reflected to account (e.g. weapon) as the mapping is weak, other should be // * overridded (e.g. fullname) as the mapping is strong. // */ // @Test // public void test190ModifyUserJackAssignAccountAndModify() throws Exception { // TestUtil.displayTestTile(this, "test190ModifyUserJackAssignAccountAndModify"); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + ".test190ModifyUserJackAssignAccountAndModify"); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<UserType> accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_OID, null, true); // ShadowDiscriminatorObjectDelta<ShadowType> accountDelta = ShadowDiscriminatorObjectDelta.createModificationReplaceProperty(ShadowType.class, // RESOURCE_DUMMY_OID, ShadowKindType.ACCOUNT, null, dummyResourceCtl.getAttributeFullnamePath(), prismContext, "Cpt. Jack Sparrow"); // accountDelta.addModificationAddProperty( // dummyResourceCtl.getAttributePath(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_WEAPON_NAME), // "smell"); // deltas.add(accountDelta); // deltas.add(accountAssignmentUserDelta); // // XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack, "Jack Sparrow"); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, USER_JACK_USERNAME); // assertEnableTimestampShadow(accountShadow, startTime, endTime); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, USER_JACK_USERNAME, "Cpt. Jack Sparrow"); // assertEnableTimestampShadow(accountModel, startTime, endTime); // // // Check account in dummy resource // assertDefaultDummyAccount(USER_JACK_USERNAME, "Cpt. Jack Sparrow", true); // DummyAccount dummyAccount = getDummyAccount(null, USER_JACK_USERNAME); // assertDummyAccountAttribute(null, USER_JACK_USERNAME, DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_WEAPON_NAME, "smell"); // assertNull("Unexpected loot", dummyAccount.getAttributeValue("loot", Integer.class)); // // assertDummyScriptsAdd(userJack, accountModel, resourceDummyType); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.ADD, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 1); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // /** // * We try to modify an assignment of the account and see whether changes will be recorded in the account itself. // * // */ // @Test // public void test191ModifyUserJackModifyAssignment() throws Exception { // final String TEST_NAME = "test191ModifyUserJackModifyAssignment"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // // //PrismPropertyDefinition definition = getAssignmentDefinition().findPropertyDefinition(new QName(SchemaConstantsGenerated.NS_COMMON, "accountConstruction")); // // PrismObject<ResourceType> dummyResource = repositoryService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, result); // // RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(dummyResource, prismContext); // // This explicitly parses the schema, therefore ... // assertResourceSchemaParseCountIncrement(1); // // RefinedObjectClassDefinition accountDefinition = refinedSchema.getRefinedDefinition(ShadowKindType.ACCOUNT, (String) null); // PrismPropertyDefinition gossipDefinition = accountDefinition.findPropertyDefinition(new QName( // "http://midpoint.evolveum.com/xml/ns/public/resource/instance/10000000-0000-0000-0000-000000000004", // DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_GOSSIP_NAME)); // assertNotNull("gossip attribute definition not found", gossipDefinition); // // ConstructionType accountConstruction = createAccountConstruction(RESOURCE_DUMMY_OID, null); // ResourceAttributeDefinitionType radt = new ResourceAttributeDefinitionType(); // radt.setRef(new ItemPathType(new ItemPath(gossipDefinition.getName()))); // MappingType outbound = new MappingType(); // radt.setOutbound(outbound); // // ExpressionType expression = new ExpressionType(); // outbound.setExpression(expression); // // MappingType value = new MappingType(); // // PrismProperty<String> property = gossipDefinition.instantiate(); // property.add(new PrismPropertyValue<String>("q")); // // List evaluators = expression.getExpressionEvaluator(); // Collection<JAXBElement<RawType>> collection = StaticExpressionUtil.serializeValueElements(property, null); // ObjectFactory of = new ObjectFactory(); // for (JAXBElement<RawType> obj : collection) { // evaluators.add(of.createValue(obj.getValue())); // } // // value.setExpression(expression); // radt.setOutbound(value); // accountConstruction.getAttribute().add(radt); // ObjectDelta<UserType> accountAssignmentUserDelta = // createReplaceAccountConstructionUserDelta(USER_JACK_OID, 1L, accountConstruction); // deltas.add(accountAssignmentUserDelta); // // preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); // // PrismObject<UserType> userJackOld = getUser(USER_JACK_OID); // display("User before change execution", userJackOld); // display("Deltas to execute execution", deltas); // // // WHEN // TestUtil.displayWhen(TEST_NAME); // modelService.executeChanges(deltas, null, task, result); // // // THEN // TestUtil.displayThen(TEST_NAME); // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // // First fetch: initial account read // // Second fetch: fetchback after modification to correctly process inbound // assertShadowFetchOperationCountIncrement(2); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack, "Jack Sparrow"); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, USER_JACK_USERNAME); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, USER_JACK_USERNAME, "Cpt. Jack Sparrow"); // // // Check account in dummy resource // assertDefaultDummyAccount(USER_JACK_USERNAME, "Cpt. Jack Sparrow", true); // DummyAccount dummyAccount = getDummyAccount(null, USER_JACK_USERNAME); // display(dummyAccount.debugDump()); // assertDummyAccountAttribute(null, USER_JACK_USERNAME, DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_GOSSIP_NAME, "q"); // //assertEquals("Missing or incorrect attribute value", "soda", dummyAccount.getAttributeValue(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_DRINK_NAME, String.class)); // // assertDummyScriptsModify(userJack, true); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // Collection<ObjectDeltaOperation<? extends ObjectType>> auditExecutionDeltas = dummyAuditService.getExecutionDeltas(); // assertEquals("Wrong number of execution deltas", 2, auditExecutionDeltas.size()); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test195ModifyUserJack() throws Exception { // final String TEST_NAME = "test195ModifyUserJack"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // // WHEN // TestUtil.displayWhen(TEST_NAME); // modifyUserReplace(USER_JACK_OID, UserType.F_FULL_NAME, task, result, // PrismTestUtil.createPolyString("Magnificent Captain Jack Sparrow")); // // // THEN // TestUtil.displayThen(TEST_NAME); // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // Strong mappings // assertShadowFetchOperationCountIncrement(1); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack, "Magnificent Captain Jack Sparrow"); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Magnificent Captain Jack Sparrow"); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Magnificent Captain Jack Sparrow", true); // // assertDummyScriptsModify(userJack); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(2); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, ShadowType.class); // // dummyAuditService.assertOldValue(ChangeType.MODIFY, UserType.class, // UserType.F_FULL_NAME, PrismTestUtil.createPolyString("Jack Sparrow")); // // We have full account here. It is loaded because of strong mapping. // dummyAuditService.assertOldValue(ChangeType.MODIFY, ShadowType.class, // dummyResourceCtl.getAttributeFullnamePath(), "Cpt. Jack Sparrow"); // // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test196ModifyUserJackLocationEmpty() throws Exception { // final String TEST_NAME = "test196ModifyUserJackLocationEmpty"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // // WHEN // modifyUserReplace(USER_JACK_OID, UserType.F_LOCALITY, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // Strong mappings // assertShadowFetchOperationCountIncrement(1); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack, "Magnificent Captain Jack Sparrow", "Jack", "Sparrow", null); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Magnificent Captain Jack Sparrow"); // IntegrationTestTools.assertNoAttribute(accountModel, dummyResourceCtl.getAttributeQName(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_LOCATION_NAME)); // // // Check account in dummy resource // assertDefaultDummyAccount("jack", "Magnificent Captain Jack Sparrow", true); // // assertDummyScriptsModify(userJack); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(2); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test197ModifyUserJackLocationNull() throws Exception { // final String TEST_NAME = "test197ModifyUserJackLocationNull"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // try { // // WHEN // modifyUserReplace(USER_JACK_OID, UserType.F_LOCALITY, task, result, (PolyString)null); // // AssertJUnit.fail("Unexpected success"); // } catch (IllegalStateException e) { // // This is expected // } // // THEN // result.computeStatus(); // TestUtil.assertFailure(result); // assertShadowFetchOperationCountIncrement(0); // // assertNoProvisioningScripts(); // // // Check audit // display("Audit", dummyAuditService); // // This should fail even before the request record is created // dummyAuditService.assertRecords(0); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test198ModifyUserJackRaw() throws Exception { // TestUtil.displayTestTile(this, "test198ModifyUserJackRaw"); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + ".test196ModifyUserJackRaw"); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // ObjectDelta<UserType> objectDelta = createModifyUserReplaceDelta(USER_JACK_OID, UserType.F_FULL_NAME, // PrismTestUtil.createPolyString("Marvelous Captain Jack Sparrow")); // Collection<ObjectDelta<? extends ObjectType>> deltas = (Collection)MiscUtil.createCollection(objectDelta); // // // WHEN // modelService.executeChanges(deltas, ModelExecuteOptions.createRaw(), task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // assertUserJack(userJack, "Marvelous Captain Jack Sparrow", "Jack", "Sparrow", null); // accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountJackOid, "jack"); // // // Check account - the original fullName should not be changed // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountJackOid, "jack", "Magnificent Captain Jack Sparrow"); // // // Check account in dummy resource - the original fullName should not be changed // assertDefaultDummyAccount("jack", "Magnificent Captain Jack Sparrow", true); // // assertNoProvisioningScripts(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(1); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // MID-2451 // dummyAuditService.assertExecutionSuccess(); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test199DeleteUserJack() throws Exception { // TestUtil.displayTestTile(this, "test199DeleteUserJack"); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + ".test199DeleteUserJack"); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // ObjectDelta<UserType> userDelta = ObjectDelta.createDeleteDelta(UserType.class, USER_JACK_OID, prismContext); // Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // try { // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // AssertJUnit.fail("Jack is still alive!"); // } catch (ObjectNotFoundException ex) { // // This is OK // } // // // Check is shadow is gone // assertNoShadow(accountJackOid); // // // Check if dummy resource account is gone // assertNoDummyAccount("jack"); // // assertDummyScriptsDelete(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(2); // dummyAuditService.assertHasDelta(ChangeType.DELETE, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.DELETE, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 1); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // checkDummyTransportMessages("simpleUserNotifier-DELETE", 1); // // assertScriptCompileIncrement(0); // assertSteadyResources(); // } // // @Test // public void test200AddUserBlackbeardWithAccount() throws Exception { // final String TEST_NAME = "test200AddUserBlackbeardWithAccount"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = createTask(TEST_NAME); // // Use custom channel to trigger a special outbound mapping // task.setChannel("http://pirates.net/avast"); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE); // // PrismObject<UserType> user = PrismTestUtil.parseObject(new File(TEST_DIR, "user-blackbeard-account-dummy.xml")); // ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(user); // Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta); // // XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userBlackbeard = modelService.getObject(UserType.class, USER_BLACKBEARD_OID, null, task, result); // UserType userBlackbeardType = userBlackbeard.asObjectable(); // assertEquals("Unexpected number of accountRefs", 1, userBlackbeardType.getLinkRef().size()); // ObjectReferenceType accountRefType = userBlackbeardType.getLinkRef().get(0); // String accountOid = accountRefType.getOid(); // assertFalse("No accountRef oid", StringUtils.isBlank(accountOid)); // // assertEncryptedUserPassword(userBlackbeard, "QueenAnne"); // assertPasswordMetadata(userBlackbeard, true, startTime, endTime, USER_ADMINISTRATOR_OID, "http://pirates.net/avast"); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountOid, "blackbeard"); // assertEnableTimestampShadow(accountShadow, startTime, endTime); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountOid, "blackbeard", "Edward Teach"); // assertEnableTimestampShadow(accountModel, startTime, endTime); // // // Check account in dummy resource // assertDefaultDummyAccount("blackbeard", "Edward Teach", true); // DummyAccount dummyAccount = getDummyAccount(null, "blackbeard"); // assertEquals("Wrong loot", (Integer)10000, dummyAccount.getAttributeValue("loot", Integer.class)); // // assertDummyScriptsAdd(userBlackbeard, accountModel, resourceDummyType); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(2); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(0, 3); // dummyAuditService.assertHasDelta(0, ChangeType.ADD, UserType.class); // dummyAuditService.assertHasDelta(0, ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(0, ChangeType.ADD, ShadowType.class); // // this one was redundant //// dummyAuditService.assertExecutionDeltas(1, 1); //// dummyAuditService.assertHasDelta(1, ChangeType.MODIFY, UserType.class); // // raw operation, no target //// dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 1); // checkDummyTransportMessages("userPasswordNotifier", 1); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 1); // checkDummyTransportMessages("simpleUserNotifier-DELETE", 0); // // assertSteadyResources(); // } // // // @Test // public void test210AddUserMorganWithAssignment() throws Exception { // final String TEST_NAME = "test210AddUserMorganWithAssignment"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = createTask(TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // PrismObject<UserType> user = PrismTestUtil.parseObject(new File(TEST_DIR, "user-morgan-assignment-dummy.xml")); // ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(user); // Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta); // // XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // // // WHEN // modelService.executeChanges(deltas, null, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userMorgan = modelService.getObject(UserType.class, USER_MORGAN_OID, null, task, result); // UserType userMorganType = userMorgan.asObjectable(); // assertEquals("Unexpected number of accountRefs", 1, userMorganType.getLinkRef().size()); // ObjectReferenceType accountRefType = userMorganType.getLinkRef().get(0); // String accountOid = accountRefType.getOid(); // assertFalse("No accountRef oid", StringUtils.isBlank(accountOid)); // // assertEncryptedUserPassword(userMorgan, "rum"); // assertPasswordMetadata(userMorgan, true, startTime, endTime); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountOid, null, result); // assertDummyAccountShadowRepo(accountShadow, accountOid, "morgan"); // assertEnableTimestampShadow(accountShadow, startTime, endTime); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountOid, null, task, result); // assertDummyAccountShadowModel(accountModel, accountOid, "morgan", "Sir Henry Morgan"); // assertEnableTimestampShadow(accountModel, startTime, endTime); // // // Check account in dummy resource // assertDefaultDummyAccount("morgan", "Sir Henry Morgan", true); // // assertDummyScriptsAdd(userMorgan, accountModel, resourceDummyType); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(3); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.ADD, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.ADD, ShadowType.class); // dummyAuditService.assertTarget(USER_MORGAN_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 1); // checkDummyTransportMessages("userPasswordNotifier", 1); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 1); // checkDummyTransportMessages("simpleUserNotifier-DELETE", 0); // // assertSteadyResources(); // } // // @Test // public void test212RenameUserMorgan() throws Exception { // final String TEST_NAME = "test212RenameUserMorgan"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // // WHEN // TestUtil.displayWhen(TEST_NAME); // modifyUserReplace(USER_MORGAN_OID, UserType.F_NAME, task, result, PrismTestUtil.createPolyString("sirhenry")); // // // THEN // TestUtil.displayThen(TEST_NAME); // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // Strong mappings // assertShadowFetchOperationCountIncrement(1); // // PrismObject<UserType> userMorgan = modelService.getObject(UserType.class, USER_MORGAN_OID, null, task, result); // UserType userMorganType = userMorgan.asObjectable(); // assertEquals("Unexpected number of accountRefs", 1, userMorganType.getLinkRef().size()); // ObjectReferenceType accountRefType = userMorganType.getLinkRef().get(0); // String accountOid = accountRefType.getOid(); // assertFalse("No accountRef oid", StringUtils.isBlank(accountOid)); // // // Check shadow // PrismObject<ShadowType> accountShadowRepo = repositoryService.getObject(ShadowType.class, accountOid, null, result); // display("Shadow repo", accountShadowRepo); // assertDummyAccountShadowRepo(accountShadowRepo, accountOid, "sirhenry"); // // // Check account // PrismObject<ShadowType> accountShadowModel = modelService.getObject(ShadowType.class, accountOid, null, task, result); // display("Shadow model", accountShadowModel); // assertDummyAccountShadowModel(accountShadowModel, accountOid, "sirhenry", "Sir Henry Morgan"); // // // Check account in dummy resource // assertDefaultDummyAccount("sirhenry", "Sir Henry Morgan", true); // // assertDummyScriptsModify(userMorgan); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(2); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // ObjectDeltaOperation<ShadowType> auditShadowDelta = dummyAuditService.assertHasDelta(ChangeType.MODIFY, ShadowType.class); // // assertEquals("Unexpected number of modifications in shadow audit delta: "+auditShadowDelta.debugDump(), 3, auditShadowDelta.getObjectDelta().getModifications().size()); // // dummyAuditService.assertOldValue(ChangeType.MODIFY, UserType.class, // UserType.F_NAME, PrismTestUtil.createPolyString("morgan")); // dummyAuditService.assertOldValue(ChangeType.MODIFY, ShadowType.class, // new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_NAME), "morgan"); // dummyAuditService.assertOldValue(ChangeType.MODIFY, ShadowType.class, // new ItemPath(ShadowType.F_ATTRIBUTES, SchemaConstants.ICFS_UID), "morgan"); // // This is a side-effect change. It is silently done by provisioning. It is not supposed to // // appear in audit log. //// dummyAuditService.assertOldValue(ChangeType.MODIFY, ShadowType.class, //// new ItemPath(ShadowType.F_NAME), PrismTestUtil.createPolyString("morgan")); // // dummyAuditService.assertTarget(USER_MORGAN_OID); // dummyAuditService.assertExecutionSuccess(); // // // Check notifications // notificationManager.setDisabled(true); // checkDummyTransportMessages("accountPasswordNotifier", 0); // checkDummyTransportMessages("userPasswordNotifier", 0); // checkDummyTransportMessages("simpleAccountNotifier-SUCCESS", 1); // checkDummyTransportMessages("simpleAccountNotifier-FAILURE", 0); // checkDummyTransportMessages("simpleAccountNotifier-ADD-SUCCESS", 0); // checkDummyTransportMessages("simpleAccountNotifier-DELETE-SUCCESS", 0); // checkDummyTransportMessages("simpleUserNotifier", 1); // checkDummyTransportMessages("simpleUserNotifier-ADD", 0); // checkDummyTransportMessages("simpleUserNotifier-DELETE", 0); // // assertSteadyResources(); // } // // /** // * This basically tests for correct auditing. // */ // @Test // public void test240AddUserCharlesRaw() throws Exception { // final String TEST_NAME = "test240AddUserCharlesRaw"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // PrismObject<UserType> user = createUser("charles", "Charles L. Charles"); // ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(user); // Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta); // // // WHEN // modelService.executeChanges(deltas, ModelExecuteOptions.createRaw(), task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userAfter = findUserByUsername("charles"); // assertNotNull("No charles", userAfter); // userCharlesOid = userAfter.getOid(); // // assertNoProvisioningScripts(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(1); // dummyAuditService.assertHasDelta(ChangeType.ADD, UserType.class); // // raw operation, no target //// dummyAuditService.assertTarget(userAfter.getOid()); // dummyAuditService.assertExecutionSuccess(); // // assertSteadyResources(); // } // // /** // * This basically tests for correct auditing. // */ // @Test // public void test241DeleteUserCharlesRaw() throws Exception { // final String TEST_NAME = "test241DeleteUserCharlesRaw"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // ObjectDelta<UserType> userDelta = ObjectDelta.createDeleteDelta(UserType.class, userCharlesOid, prismContext); // Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta); // // // WHEN // modelService.executeChanges(deltas, ModelExecuteOptions.createRaw(), task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userAfter = findUserByUsername("charles"); // assertNull("Charles is not gone", userAfter); // // assertNoProvisioningScripts(); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(2); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(1); // dummyAuditService.assertHasDelta(ChangeType.DELETE, UserType.class); // // raw operation, no target //// dummyAuditService.assertTarget(userCharlesOid); // dummyAuditService.assertExecutionSuccess(); // // assertSteadyResources(); // } // // @Test // public void test300AddUserJackWithAssignmentBlue() throws Exception { // final String TEST_NAME="test300AddUserJackWithAssignmentBlue"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.RELATIVE); // // PrismObject<UserType> userJack = PrismTestUtil.parseObject(USER_JACK_FILE); // AssignmentType assignmentBlue = createAssignment(RESOURCE_DUMMY_BLUE_OID, ShadowKindType.ACCOUNT, null); // userJack.asObjectable().getAssignment().add(assignmentBlue); // // ObjectDelta<UserType> delta = ObjectDelta.createAddDelta(userJack); // // XMLGregorianCalendar startTime = clock.currentTimeXMLGregorianCalendar(); // // // WHEN // TestUtil.displayWhen(TEST_NAME); // modelService.executeChanges(MiscSchemaUtil.createCollection(delta), null, task, result); // // // THEN // TestUtil.displayThen(TEST_NAME); // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // XMLGregorianCalendar endTime = clock.currentTimeXMLGregorianCalendar(); // assertShadowFetchOperationCountIncrement(0); // // PrismObject<UserType> userJackAfter = getUser(USER_JACK_OID); // display("User after change execution", userJackAfter); // assertUserJack(userJackAfter); // accountJackBlueOid = getSingleLinkOid(userJackAfter); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackBlueOid, null, result); // assertAccountShadowRepo(accountShadow, accountJackBlueOid, USER_JACK_USERNAME, resourceDummyBlueType); // assertEnableTimestampShadow(accountShadow, startTime, endTime); // // // Check account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackBlueOid, null, task, result); // assertShadowModel(accountModel, accountJackBlueOid, USER_JACK_USERNAME, resourceDummyBlueType, getAccountObjectClass(resourceDummyBlueType)); // assertEnableTimestampShadow(accountModel, startTime, endTime); // // // Check account in dummy resource // assertDummyAccount(RESOURCE_DUMMY_BLUE_NAME, USER_JACK_USERNAME, USER_JACK_FULL_NAME, true); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(3); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(3); // dummyAuditService.assertHasDelta(ChangeType.ADD, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); // dummyAuditService.assertHasDelta(ChangeType.ADD, ShadowType.class); // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // assertSteadyResources(); // } // // /** // * modify account blue directly + request reconcile. check old value in delta. // */ // @Test // public void test302ModifyAccountJackDummyBlue() throws Exception { // final String TEST_NAME = "test302ModifyAccountJackDummyBlue"; // TestUtil.displayTestTile(this, TEST_NAME); // // // GIVEN // Task task = taskManager.createTaskInstance(TestNotifications.class.getName() + "." + TEST_NAME); // OperationResult result = task.getResult(); // preTestCleanup(AssignmentPolicyEnforcementType.FULL); // // Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); // ObjectDelta<ShadowType> accountDelta = ObjectDelta.createModificationReplaceProperty(ShadowType.class, // accountJackBlueOid, dummyResourceCtlBlue.getAttributeFullnamePath(), prismContext, "Cpt. Jack Sparrow"); // accountDelta.addModificationReplaceProperty( // dummyResourceCtlBlue.getAttributePath(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME), // "Queen Anne's Revenge"); // deltas.add(accountDelta); // // ModelExecuteOptions options = ModelExecuteOptions.createReconcile(); // // // WHEN // modelService.executeChanges(deltas, options, task, result); // // // THEN // result.computeStatus(); // TestUtil.assertSuccess("executeChanges result", result); // // Not sure why 2 ... but this is not a big problem now // assertShadowFetchOperationCountIncrement(2); // // PrismObject<UserType> userJack = getUser(USER_JACK_OID); // display("User after change execution", userJack); // // Fullname inbound mapping is not used because it is weak // assertUserJack(userJack, "Jack Sparrow", "Jack", "Sparrow"); // String accountJackOid = getSingleLinkOid(userJack); // // // Check shadow // PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountJackOid, null, result); // assertAccountShadowRepo(accountShadow, accountJackBlueOid, USER_JACK_USERNAME, resourceDummyBlueType); // // // Check account // // All the changes should be reflected to the account // PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountJackOid, null, task, result); // assertAccountShadowRepo(accountShadow, accountJackBlueOid, USER_JACK_USERNAME, resourceDummyBlueType); // // // Check account in dummy resource // assertDummyAccount(RESOURCE_DUMMY_BLUE_NAME, USER_JACK_USERNAME, "Cpt. Jack Sparrow", true); // // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertSimpleRecordSanity(); // dummyAuditService.assertRecords(2); // dummyAuditService.assertAnyRequestDeltas(); // // dummyAuditService.assertExecutionDeltas(0, 1); // dummyAuditService.assertHasDelta(0, ChangeType.MODIFY, ShadowType.class); // dummyAuditService.assertOldValue(0, ChangeType.MODIFY, ShadowType.class, // dummyResourceCtlBlue.getAttributeFullnamePath(), "Jack Sparrow"); //// dummyAuditService.assertOldValue(0, ChangeType.MODIFY, ShadowType.class, //// dummyResourceCtl.getAttributePath(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME)); // // dummyAuditService.assertTarget(USER_JACK_OID); // dummyAuditService.assertExecutionSuccess(); // // // First time the blue resource is used // assertResourceSchemaParseCountIncrement(1); // assertSteadyResources(); // } private void assertMessageContains(String message, String string) { assert message.contains(string) : "Expected message to contain '"+string+"' but it does not; message: " + message; } private void purgeScriptHistory() { getDummyResource().purgeScriptHistory(); } private void assertNoProvisioningScripts() { if (!getDummyResource().getScriptHistory().isEmpty()) { IntegrationTestTools.displayScripts(getDummyResource().getScriptHistory()); AssertJUnit.fail(getDummyResource().getScriptHistory().size()+" provisioning scripts were executed while not expected any"); } } private void assertDummyScriptsAdd(PrismObject<UserType> user, PrismObject<? extends ShadowType> account, ResourceType resource) { ProvisioningScriptSpec script = new ProvisioningScriptSpec("\nto spiral :size\n" + " if :size > 30 [stop]\n fd :size rt 15\n spiral :size *1.02\nend\n "); String userName = null; if (user != null) { userName = user.asObjectable().getName().getOrig(); } script.addArgSingle("usr", "user: "+userName); // Note: We cannot test for account name as name is only assigned in provisioning String accountEnabled = null; if (account != null && account.asObjectable().getActivation() != null && account.asObjectable().getActivation().getAdministrativeStatus() != null) { accountEnabled = account.asObjectable().getActivation().getAdministrativeStatus().toString(); } script.addArgSingle("acc", "account: "+accountEnabled); String resourceName = null; if (resource != null) { resourceName = resource.getName().getOrig(); } script.addArgSingle("res", "resource: "+resourceName); script.addArgSingle("size", "3"); script.setLanguage("Logo"); IntegrationTestTools.assertScripts(getDummyResource().getScriptHistory(), script); } private void assertDummyScriptsModify(PrismObject<UserType> user) { assertDummyScriptsModify(user, false); } private void assertDummyScriptsModify(PrismObject<UserType> user, boolean recon) { ProvisioningScriptSpec modScript = new ProvisioningScriptSpec("Beware the Jabberwock, my son!"); String name = null; String fullName = null; String costCenter = null; if (user != null) { name = user.asObjectable().getName().getOrig(); fullName = user.asObjectable().getFullName().getOrig(); costCenter = user.asObjectable().getCostCenter(); } modScript.addArgSingle("howMuch", costCenter); modScript.addArgSingle("howLong", "from here to there"); modScript.addArgSingle("who", name); modScript.addArgSingle("whatchacallit", fullName); if (recon) { ProvisioningScriptSpec reconBeforeScript = new ProvisioningScriptSpec("The vorpal blade went snicker-snack!"); reconBeforeScript.addArgSingle("who", name); ProvisioningScriptSpec reconAfterScript = new ProvisioningScriptSpec("He left it dead, and with its head"); reconAfterScript.addArgSingle("how", "enabled"); IntegrationTestTools.assertScripts(getDummyResource().getScriptHistory(), reconBeforeScript, modScript, reconAfterScript); } else { IntegrationTestTools.assertScripts(getDummyResource().getScriptHistory(), modScript); } } private void assertDummyScriptsDelete() { ProvisioningScriptSpec script = new ProvisioningScriptSpec("The Jabberwock, with eyes of flame"); IntegrationTestTools.assertScripts(getDummyResource().getScriptHistory(), script); } private void assertDummyScriptsNone() { IntegrationTestTools.assertScripts(getDummyResource().getScriptHistory()); } private void preTestCleanup(AssignmentPolicyEnforcementType enforcementPolicy) throws ObjectNotFoundException, SchemaException, ObjectAlreadyExistsException { assumeAssignmentPolicy(enforcementPolicy); dummyAuditService.clear(); prepareNotifications(); purgeScriptHistory(); rememberShadowFetchOperationCount(); } }