/* * Copyright (c) 2013 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 static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertNotNull; import java.io.File; import com.evolveum.midpoint.model.intest.util.StaticHookRecorder; import com.evolveum.midpoint.prism.polystring.PolyString; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.DummyResourceContoller; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** * @author Radovan Semancik * */ @ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestScriptHooks extends AbstractInitializedModelIntegrationTest { private static final File TEST_DIR = new File("src/test/resources/scripthooks"); protected static final File RESOURCE_DUMMY_HOOK_FILE = new File(TEST_DIR, "resource-dummy-hook.xml"); protected static final String RESOURCE_DUMMY_HOOK_OID = "10000000-0000-0000-0000-000004444001"; protected static final String RESOURCE_DUMMY_HOOK_NAME = "hook"; protected static final String RESOURCE_DUMMY_HOOK_NAMESPACE = MidPointConstants.NS_RI; private static final File ORG_TOP_FILE = new File(TEST_DIR, "org-top.xml"); private static final String ORG_TOP_OID = "80808080-8888-6666-0000-100000000001"; private static final File GENERIC_BLACK_PEARL_FILE = new File(TEST_DIR, "generic-blackpearl.xml"); private static final String GENERIC_BLACK_PEARL_OID = "54195419-5419-5419-5419-000000000001"; private static final File SYSTEM_CONFIGURATION_HOOKS_FILE = new File(TEST_DIR, "system-configuration-hooks.xml"); protected DummyResource dummyResourceHook; protected DummyResourceContoller dummyResourceCtlHook; protected ResourceType resourceDummyHookType; protected PrismObject<ResourceType> resourceDummyHook; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); dummyResourceCtlHook = DummyResourceContoller.create(RESOURCE_DUMMY_HOOK_NAME, resourceDummyHook); dummyResourceCtlHook.extendSchemaPirate(); dummyResourceHook = dummyResourceCtlHook.getDummyResource(); resourceDummyHook = importAndGetObjectFromFile(ResourceType.class, RESOURCE_DUMMY_HOOK_FILE, RESOURCE_DUMMY_HOOK_OID, initTask, initResult); resourceDummyHookType = resourceDummyHook.asObjectable(); dummyResourceCtlHook.setResource(resourceDummyHook); importObjectFromFile(GENERIC_BLACK_PEARL_FILE); importObjectFromFile(ORG_TOP_FILE); } @Override protected File getSystemConfigurationFile() { return SYSTEM_CONFIGURATION_HOOKS_FILE; } @Test public void test100JackAssignHookAccount() throws Exception { final String TEST_NAME = "test100JackAssignHookAccount"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestScriptHooks.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE); dummyAuditService.clear(); StaticHookRecorder.reset(); // WHEN assignAccount(USER_JACK_OID, RESOURCE_DUMMY_HOOK_OID, null, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = getUser(USER_JACK_OID); display("User after change execution", userJack); assertUserJack(userJack); String accountOid = getSingleLinkOid(userJack); // Check shadow PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountOid, null, result); display("Shadow (repo)", accountShadow); assertAccountShadowRepo(accountShadow, accountOid, ACCOUNT_JACK_DUMMY_USERNAME, resourceDummyHookType); // Check account PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountOid, null, task, result); display("Shadow (model)", accountModel); assertAccountShadowModel(accountModel, accountOid, ACCOUNT_JACK_DUMMY_USERNAME, resourceDummyHookType); // Check account in dummy resource assertDummyAccount(RESOURCE_DUMMY_HOOK_NAME, ACCOUNT_JACK_DUMMY_USERNAME, "Jack Sparrow", true); display("StaticHookRecorder", StaticHookRecorder.dump()); StaticHookRecorder.assertInvocationCount("org", 1); StaticHookRecorder.assertInvocationCount("foo", 5); StaticHookRecorder.assertInvocationCount("bar", 5); StaticHookRecorder.assertInvocationCount("bar-user", 1); // 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(); } @Test public void test110JackAddOrganization() throws Exception { final String TEST_NAME = "test110JackAddOrganization"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestScriptHooks.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE); dummyAuditService.clear(); StaticHookRecorder.reset(); // WHEN modifyUserAdd(USER_JACK_OID, UserType.F_ORGANIZATION, task, result, new PolyString("Pirate Brethren")); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = getUser(USER_JACK_OID); display("User after change execution", userJack); assertUserJack(userJack); String accountOid = getSingleLinkOid(userJack); // Check shadow PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountOid, null, result); display("Shadow (repo)", accountShadow); assertAccountShadowRepo(accountShadow, accountOid, ACCOUNT_JACK_DUMMY_USERNAME, resourceDummyHookType); // Check account PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountOid, null, task, result); display("Shadow (model)", accountModel); assertAccountShadowModel(accountModel, accountOid, ACCOUNT_JACK_DUMMY_USERNAME, resourceDummyHookType); // Check account in dummy resource assertDummyAccount(RESOURCE_DUMMY_HOOK_NAME, ACCOUNT_JACK_DUMMY_USERNAME, "Jack Sparrow", true); PrismObject<OrgType> brethrenOrg = searchObjectByName(OrgType.class, "Pirate Brethren", task, result); assertNotNull("Brethren org was not created", brethrenOrg); display("Brethren org", brethrenOrg); assertAssignedOrg(userJack, brethrenOrg); display("StaticHookRecorder", StaticHookRecorder.dump()); StaticHookRecorder.assertInvocationCount("org", 1); StaticHookRecorder.assertInvocationCount("foo", 10); StaticHookRecorder.assertInvocationCount("bar", 10); StaticHookRecorder.assertInvocationCount("bar-user", 1); // TODO // // Check audit // display("Audit", dummyAuditService); // dummyAuditService.assertRecords(4); // dummyAuditService.assertAnyRequestDeltas(); // dummyAuditService.assertExecutionDeltas(1,1); // dummyAuditService.asserHasDelta(1,ChangeType.ADD, OrgType.class); // dummyAuditService.assertExecutionDeltas(3,1); // dummyAuditService.asserHasDelta(3,ChangeType.MODIFY, UserType.class); // dummyAuditService.assertExecutionSuccess(); } }