/* * Copyright (c) 2010-2015 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.model.intest; import com.evolveum.icf.dummy.resource.DummyAccount; import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.icf.dummy.resource.DummySyncStyle; import com.evolveum.midpoint.prism.PrismObject; 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.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationSituationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; 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 java.io.File; import java.io.FileNotFoundException; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; /** * Tests inbound mappings. Uses live sync to do that. * These tests are much simpler and more focused than those in AbstractSynchronizationStoryTest. * * @author mederly * */ @ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestMappingInbound extends AbstractInitializedModelIntegrationTest { public static final File TEST_DIR = new File("src/test/resources/mapping-inbound"); protected static final File RESOURCE_DUMMY_TEA_GREEN_FILE = new File(TEST_DIR, "resource-dummy-tea-green.xml"); protected static final String RESOURCE_DUMMY_TEA_GREEN_OID = "10000000-0000-0000-0000-00000000c404"; protected static final String RESOURCE_DUMMY_TEA_GREEN_NAME = "tea-green"; protected static final String ACCOUNT_MANCOMB_DUMMY_USERNAME = "mancomb"; protected static final String TASK_LIVE_SYNC_DUMMY_TEA_GREEN_FILENAME = TEST_DIR + "/task-dumy-tea-green-livesync.xml"; protected static final String TASK_LIVE_SYNC_DUMMY_TEA_GREEN_OID = "10000000-0000-0000-5555-55550000c404"; protected PrismObject<ResourceType> resourceDummyTeaGreen; protected DummyResourceContoller dummyResourceCtlTeaGreen; protected DummyResource dummyResourceTeaGreen; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); dummyResourceCtlTeaGreen = DummyResourceContoller.create(RESOURCE_DUMMY_TEA_GREEN_NAME, null); dummyResourceCtlTeaGreen.extendSchemaPirate(); dummyResourceTeaGreen = dummyResourceCtlTeaGreen.getDummyResource(); dummyResourceTeaGreen.setSyncStyle(DummySyncStyle.SMART); resourceDummyTeaGreen = importAndGetObjectFromFile(ResourceType.class, RESOURCE_DUMMY_TEA_GREEN_FILE, RESOURCE_DUMMY_TEA_GREEN_OID, initTask, initResult); dummyResourceCtlTeaGreen.setResource(resourceDummyTeaGreen); } @Test public void test100ImportLiveSyncTaskDummyTeaGreen() throws Exception { final String TEST_NAME = "test100ImportLiveSyncTaskDummyTeaGreen"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestMappingInbound.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); /// WHEN TestUtil.displayWhen(TEST_NAME); importSyncTask(); // THEN TestUtil.displayThen(TEST_NAME); waitForSyncTaskStart(); } @Test public void test110AddDummyTeaGreenAccountMancomb() throws Exception { final String TEST_NAME = "test110AddDummyTeaGreenAccountMancomb"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestMappingInbound.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // Preconditions //assertUsers(5); DummyAccount account = new DummyAccount(ACCOUNT_MANCOMB_DUMMY_USERNAME); account.setEnabled(true); account.addAttributeValues(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_FULLNAME_NAME, "Mancomb Seepgood"); account.addAttributeValues(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_LOCATION_NAME, "Melee Island"); /// WHEN TestUtil.displayWhen(TEST_NAME); dummyResourceTeaGreen.addAccount(account); waitForSyncTaskNextRun(); // THEN TestUtil.displayThen(TEST_NAME); PrismObject<ShadowType> accountMancomb = findAccountByUsername(ACCOUNT_MANCOMB_DUMMY_USERNAME, resourceDummyTeaGreen); display("Account mancomb", accountMancomb); assertNotNull("No mancomb account shadow", accountMancomb); assertEquals("Wrong resourceRef in mancomb account", RESOURCE_DUMMY_TEA_GREEN_OID, accountMancomb.asObjectable().getResourceRef().getOid()); assertShadowOperationalData(accountMancomb, SynchronizationSituationType.LINKED, null); PrismObject<UserType> userMancomb = findUserByUsername(ACCOUNT_MANCOMB_DUMMY_USERNAME); display("User mancomb", userMancomb); assertNotNull("User mancomb was not created", userMancomb); assertLinks(userMancomb, 1); assertAdministrativeStatusEnabled(userMancomb); assertLinked(userMancomb, accountMancomb); // assertUsers(6); // notifications notificationManager.setDisabled(true); } @Test public void test150UserReconcile() throws Exception { final String TEST_NAME = "test150UserReconcile"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestMappingInbound.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); dummyAuditService.clear(); // Preconditions //assertUsers(5); /// WHEN TestUtil.displayWhen(TEST_NAME); PrismObject<UserType> userMancomb = findUserByUsername(ACCOUNT_MANCOMB_DUMMY_USERNAME); assertNotNull("User mancomb has disappeared", userMancomb); reconcileUser(userMancomb.getOid(), task, result); // THEN TestUtil.displayThen(TEST_NAME); PrismObject<ShadowType> accountMancomb = findAccountByUsername(ACCOUNT_MANCOMB_DUMMY_USERNAME, resourceDummyTeaGreen); display("Account mancomb", accountMancomb); assertNotNull("No mancomb account shadow", accountMancomb); assertEquals("Wrong resourceRef in mancomb account", RESOURCE_DUMMY_TEA_GREEN_OID, accountMancomb.asObjectable().getResourceRef().getOid()); assertShadowOperationalData(accountMancomb, SynchronizationSituationType.LINKED, null); userMancomb = findUserByUsername(ACCOUNT_MANCOMB_DUMMY_USERNAME); display("User mancomb", userMancomb); assertLinks(userMancomb, 1); assertAdministrativeStatusEnabled(userMancomb); assertLinked(userMancomb, accountMancomb); // assertUsers(6); // notifications notificationManager.setDisabled(true); display("Audit", dummyAuditService); dummyAuditService.assertRecords(2); } @Test public void test300DeleteDummyTeaGreenAccountMancomb() throws Exception { final String TEST_NAME = "test300DeleteDummyTeaGreenAccountMancomb"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestMappingInbound.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); /// WHEN TestUtil.displayWhen(TEST_NAME); dummyResourceTeaGreen.deleteAccountByName(ACCOUNT_MANCOMB_DUMMY_USERNAME); display("Dummy (tea green) resource", dummyResourceTeaGreen.debugDump()); // Make sure we have steady state waitForSyncTaskNextRun(); // THEN TestUtil.displayThen(TEST_NAME); assertNoDummyAccount(RESOURCE_DUMMY_TEA_GREEN_NAME, ACCOUNT_MANCOMB_DUMMY_USERNAME); assertNoShadow(ACCOUNT_MANCOMB_DUMMY_USERNAME, resourceDummyTeaGreen, task, result); PrismObject<UserType> user = findUserByUsername(ACCOUNT_MANCOMB_DUMMY_USERNAME); display("User mancomb", user); assertNotNull("User mancomb disappeared", user); assertUser(user, null, ACCOUNT_MANCOMB_DUMMY_USERNAME, "Mancomb Seepgood", null, null); assertLinks(user, 0); // assertUsers(7 + getNumberOfExtraDummyUsers()); // notifications notificationManager.setDisabled(true); } protected void importSyncTask() throws FileNotFoundException { importObjectFromFile(TASK_LIVE_SYNC_DUMMY_TEA_GREEN_FILENAME); } protected void waitForSyncTaskStart() throws Exception { waitForTaskStart(TASK_LIVE_SYNC_DUMMY_TEA_GREEN_OID, false, 10000); } protected void waitForSyncTaskNextRun() throws Exception { waitForTaskNextRunAssertSuccess(TASK_LIVE_SYNC_DUMMY_TEA_GREEN_OID, false, 10000); } }