/* * Copyright (c) 2016-2017 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.model.impl; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import java.io.File; import java.util.Collection; import javax.xml.namespace.QName; import com.evolveum.midpoint.common.refinery.*; 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 com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; /** * @author semancik * */ @ContextConfiguration(locations = {"classpath:ctx-model-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestRefinedSchema extends AbstractInternalModelIntegrationTest { protected static final File TEST_DIR = new File("src/test/resources/refinedschema"); public static final File TASK_RECONCILE_DUMMY_OBJECTCLASS_FILE = new File(TEST_DIR, "task-reconcile-dummy-objectclass.xml"); public static final String TASK_RECONCILE_DUMMY_OBJECTCLASS_OID = "bed15976-e604-11e5-a181-af0dade5e5a0"; public static final File TASK_RECONCILE_DUMMY_KIND_INTENT_FILE = new File(TEST_DIR, "task-reconcile-dummy-kind-intent.xml"); public static final String TASK_RECONCILE_DUMMY_KIND_INTENT_OID = "d4cd18f2-e60c-11e5-a806-3faae6c13aff"; public static final File TASK_RECONCILE_DUMMY_KIND_INTENT_OBJECTCLASS_FILE = new File(TEST_DIR, "task-reconcile-dummy-kind-intent-objectclass.xml"); public static final String TASK_RECONCILE_DUMMY_KIND_INTENT_OBJECTCLASS_OID = "3f2a1140-e60e-11e5-adb7-776abfbb2227"; private RefinedResourceSchema refinedSchema; private RefinedResourceSchema refinedSchemaModel; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); InternalMonitor.reset(); // InternalMonitor.setTraceShadowFetchOperation(true); } @Test public void test000Sanity() throws Exception { final String TEST_NAME = "test000Sanity"; TestUtil.displayTestTile(this, TEST_NAME); // WHEN refinedSchema = RefinedResourceSchemaImpl.getRefinedSchema(getDummyResourceType(), prismContext); display("Dummy refined schema", refinedSchema); // THEN getDummyResourceController().assertRefinedSchemaSanity(refinedSchema); } @Test public void test010SanityModel() throws Exception { final String TEST_NAME = "test010SanityModel"; TestUtil.displayTestTile(this, TEST_NAME); // WHEN refinedSchemaModel = RefinedResourceSchemaImpl.getRefinedSchema(getDummyResourceType(), LayerType.MODEL, prismContext); display("Dummy refined schema (MODEL)", refinedSchemaModel); // THEN getDummyResourceController().assertRefinedSchemaSanity(refinedSchemaModel); assertTrue("Not layer refined schema, it is "+refinedSchemaModel.getClass(), refinedSchemaModel instanceof LayerRefinedResourceSchema); assertEquals("Wrong layer", LayerType.MODEL, ((LayerRefinedResourceSchema)refinedSchemaModel).getLayer()); } @Test public void test100EntitlementRefinedObjectClasses() throws Exception { final String TEST_NAME = "test100EntitlementRefinedObjectClasses"; TestUtil.displayTestTile(this, TEST_NAME); // WHEN Collection<? extends RefinedObjectClassDefinition> entitlementROcDefs = refinedSchema.getRefinedDefinitions(ShadowKindType.ENTITLEMENT); display("entitlement rOcDefs", entitlementROcDefs); // THEN for (RefinedObjectClassDefinition entitlementROcDef: entitlementROcDefs) { assertEquals("Wrong kind in "+entitlementROcDef, ShadowKindType.ENTITLEMENT, entitlementROcDef.getKind()); } assertEquals("Wrong number of entitlement rOcDefs", 6, entitlementROcDefs.size()); } @Test public void test101EntitlementRefinedObjectClassesModel() throws Exception { final String TEST_NAME = "test101EntitlementRefinedObjectClassesModel"; TestUtil.displayTestTile(this, TEST_NAME); // WHEN Collection<? extends RefinedObjectClassDefinition> entitlementROcDefs = refinedSchemaModel.getRefinedDefinitions(ShadowKindType.ENTITLEMENT); display("entitlement rOcDefs", entitlementROcDefs); // THEN for (RefinedObjectClassDefinition entitlementROcDef: entitlementROcDefs) { assertEquals("Wrong kind in "+entitlementROcDef, ShadowKindType.ENTITLEMENT, entitlementROcDef.getKind()); } assertEquals("Wrong number of entitlement rOcDefs", 6, entitlementROcDefs.size()); } @Test public void test110DetermineObjectClassObjectClass() throws Exception { final String TEST_NAME = "test110DetermineObjectClassObjectClass"; TestUtil.displayTestTile(this, TEST_NAME); OperationResult result = new OperationResult(TestRefinedSchema.class.getName() + "." + TEST_NAME); importObjectFromFile(TASK_RECONCILE_DUMMY_OBJECTCLASS_FILE); Task task = taskManager.getTask(TASK_RECONCILE_DUMMY_OBJECTCLASS_OID, result); display("Task", task); // WHEN ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchema, task); // THEN display("Object class", objectClass); deleteObject(TaskType.class, TASK_RECONCILE_DUMMY_OBJECTCLASS_OID); assertObjectClass(objectClass, RESOURCE_DUMMY_ACCOUNT_OBJECTCLASS_QNAME); } @Test public void test112DetermineObjectClassKindIntent() throws Exception { final String TEST_NAME = "test112DetermineObjectClassKindIntent"; TestUtil.displayTestTile(this, TEST_NAME); OperationResult result = new OperationResult(TestRefinedSchema.class.getName() + "." + TEST_NAME); importObjectFromFile(TASK_RECONCILE_DUMMY_KIND_INTENT_FILE); Task task = taskManager.getTask(TASK_RECONCILE_DUMMY_KIND_INTENT_OID, result); display("Task", task); // WHEN ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchema, task); // THEN display("Object class", objectClass); deleteObject(TaskType.class, TASK_RECONCILE_DUMMY_KIND_INTENT_OID); assertRefinedObjectClass(objectClass, RESOURCE_DUMMY_PRIVILEGE_OBJECTCLASS_QNAME, ShadowKindType.ENTITLEMENT, "privilege"); } @Test public void test114DetermineObjectClassKindIntentObjectClass() throws Exception { final String TEST_NAME = "test114DetermineObjectClassKindIntentObjectClass"; TestUtil.displayTestTile(this, TEST_NAME); OperationResult result = new OperationResult(TestRefinedSchema.class.getName() + "." + TEST_NAME); importObjectFromFile(TASK_RECONCILE_DUMMY_KIND_INTENT_OBJECTCLASS_FILE); Task task = taskManager.getTask(TASK_RECONCILE_DUMMY_KIND_INTENT_OBJECTCLASS_OID, result); display("Task", task); // WHEN ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchema, task); // THEN display("Object class", objectClass); deleteObject(TaskType.class, TASK_RECONCILE_DUMMY_KIND_INTENT_OBJECTCLASS_OID); assertRefinedObjectClass(objectClass, RESOURCE_DUMMY_PRIVILEGE_OBJECTCLASS_QNAME, ShadowKindType.ENTITLEMENT, "privilege"); } @Test public void test120DetermineObjectClassObjectClassModel() throws Exception { final String TEST_NAME = "test120DetermineObjectClassObjectClassModel"; TestUtil.displayTestTile(this, TEST_NAME); OperationResult result = new OperationResult(TestRefinedSchema.class.getName() + "." + TEST_NAME); importObjectFromFile(TASK_RECONCILE_DUMMY_OBJECTCLASS_FILE); Task task = taskManager.getTask(TASK_RECONCILE_DUMMY_OBJECTCLASS_OID, result); display("Task", task); // WHEN ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchemaModel, task); // THEN display("Object class", objectClass); display("Object class (toString)", objectClass.toString()); deleteObject(TaskType.class, TASK_RECONCILE_DUMMY_OBJECTCLASS_OID); assertObjectClass(objectClass, RESOURCE_DUMMY_ACCOUNT_OBJECTCLASS_QNAME); } @Test public void test122DetermineObjectClassKindIntentModel() throws Exception { final String TEST_NAME = "test122DetermineObjectClassKindIntentModel"; TestUtil.displayTestTile(this, TEST_NAME); OperationResult result = new OperationResult(TestRefinedSchema.class.getName() + "." + TEST_NAME); importObjectFromFile(TASK_RECONCILE_DUMMY_KIND_INTENT_FILE); Task task = taskManager.getTask(TASK_RECONCILE_DUMMY_KIND_INTENT_OID, result); display("Task", task); // WHEN ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchemaModel, task); // THEN display("Object class", objectClass); display("Object class (toString)", objectClass.toString()); deleteObject(TaskType.class, TASK_RECONCILE_DUMMY_KIND_INTENT_OID); assertLayerRefinedObjectClass(objectClass, RESOURCE_DUMMY_PRIVILEGE_OBJECTCLASS_QNAME, ShadowKindType.ENTITLEMENT, "privilege", LayerType.MODEL); } @Test public void test124DetermineObjectClassKindIntentObjectClassModel() throws Exception { final String TEST_NAME = "test124DetermineObjectClassKindIntentObjectClassModel"; TestUtil.displayTestTile(this, TEST_NAME); OperationResult result = new OperationResult(TestRefinedSchema.class.getName() + "." + TEST_NAME); importObjectFromFile(TASK_RECONCILE_DUMMY_KIND_INTENT_OBJECTCLASS_FILE); Task task = taskManager.getTask(TASK_RECONCILE_DUMMY_KIND_INTENT_OBJECTCLASS_OID, result); display("Task", task); // WHEN ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchemaModel, task); // THEN display("Object class", objectClass); display("Object class (toString)", objectClass.toString()); deleteObject(TaskType.class, TASK_RECONCILE_DUMMY_KIND_INTENT_OBJECTCLASS_OID); assertLayerRefinedObjectClass(objectClass, RESOURCE_DUMMY_PRIVILEGE_OBJECTCLASS_QNAME, ShadowKindType.ENTITLEMENT, "privilege", LayerType.MODEL); } private void assertObjectClass(ObjectClassComplexTypeDefinition objectClass, QName objectClassQName) { assertNotNull("No object class", objectClass); assertEquals("Wrong object class QName in object class "+objectClass, objectClassQName, objectClass.getTypeName()); } private void assertRefinedObjectClass(ObjectClassComplexTypeDefinition objectClass, QName objectClassQName, ShadowKindType kind, String intent) { assertNotNull("No object class", objectClass); if (!(objectClass instanceof RefinedObjectClassDefinition)) { AssertJUnit.fail("Expected refined object class definition, but it was "+objectClass+" ("+objectClass.getClass()+")"); } RefinedObjectClassDefinition rOcDef = (RefinedObjectClassDefinition)objectClass; assertEquals("Wrong object class QName in rOcDef "+rOcDef, objectClassQName, rOcDef.getTypeName()); assertEquals("Wrong kind in rOcDef "+rOcDef, kind, rOcDef.getKind()); assertEquals("Wrong kind in rOcDef "+rOcDef, intent, rOcDef.getIntent()); } private void assertLayerRefinedObjectClass(ObjectClassComplexTypeDefinition objectClass, QName objectClassQName, ShadowKindType kind, String intent, LayerType layer) { assertRefinedObjectClass(objectClass, objectClassQName, kind, intent); assertTrue("Not layer refined definition, it is "+refinedSchemaModel.getClass(), objectClass instanceof LayerRefinedObjectClassDefinition); assertEquals("Wrong layer", layer, ((LayerRefinedObjectClassDefinition)objectClass).getLayer()); } }