/*
* Copyright (c) 2010-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.intest;
import static org.testng.AssertJUnit.assertNull;
import static com.evolveum.midpoint.test.IntegrationTestTools.display;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import javax.xml.namespace.QName;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
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 org.w3c.dom.Element;
import com.evolveum.icf.dummy.resource.DummyResource;
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.repo.sql.testing.CarefulAnt;
import com.evolveum.midpoint.repo.sql.testing.ResourceCarefulAntUtil;
import com.evolveum.midpoint.repo.sql.testing.SqlRepoTestUtil;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ResultHandler;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.internals.InternalMonitor;
import com.evolveum.midpoint.schema.internals.InternalsConfig;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.schema.util.ResourceTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.DummyResourceContoller;
import com.evolveum.midpoint.test.IntegrationTestTools;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.exception.CommunicationException;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.ExpressionEvaluationException;
import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.PolicyViolationException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
/**
* @author semancik
*
*/
@ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class TestResources extends AbstractConfiguredModelIntegrationTest {
public static final File TEST_DIR = new File("src/test/resources/contract");
private static final int MAX_RANDOM_SEQUENCE_ITERATIONS = 15;
private static List<CarefulAnt<ResourceType>> ants = new ArrayList<CarefulAnt<ResourceType>>();
private static CarefulAnt<ResourceType> descriptionAnt;
private static String lastVersion;
private static Random rnd = new Random();
protected DummyResource dummyResource;
protected DummyResourceContoller dummyResourceCtl;
protected ResourceType resourceDummyType;
protected PrismObject<ResourceType> resourceDummy;
protected DummyResource dummyResourceRed;
protected DummyResourceContoller dummyResourceCtlRed;
protected ResourceType resourceDummyRedType;
protected PrismObject<ResourceType> resourceDummyRed;
@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);
dummyResourceCtl = DummyResourceContoller.create(null);
dummyResourceCtl.extendSchemaPirate();
dummyResource = dummyResourceCtl.getDummyResource();
dummyResourceCtl.addAttrDef(dummyResource.getAccountObjectClass(),
DUMMY_ACCOUNT_ATTRIBUTE_SEA_NAME, String.class, false, false);
// Add resource directly to repo to avoid any initialization
resourceDummy = PrismTestUtil.parseObject(RESOURCE_DUMMY_FILE);
PrismObject<ConnectorType> connectorDummy = findConnectorByTypeAndVersion(CONNECTOR_DUMMY_TYPE, CONNECTOR_DUMMY_VERSION, initResult);
resourceDummy.asObjectable().getConnectorRef().setOid(connectorDummy.getOid());
repositoryService.addObject(resourceDummy, null, initResult);
resourceDummyType = resourceDummy.asObjectable();
dummyResourceCtl.setResource(resourceDummy);
dummyResourceCtlRed = DummyResourceContoller.create(RESOURCE_DUMMY_RED_NAME, resourceDummyRed);
dummyResourceCtlRed.extendSchemaPirate();
dummyResourceRed = dummyResourceCtlRed.getDummyResource();
// Add resource directly to repo to avoid any initialization
resourceDummyRed = PrismTestUtil.parseObject(RESOURCE_DUMMY_RED_FILE);
resourceDummyRed.asObjectable().getConnectorRef().setOid(connectorDummy.getOid());
repositoryService.addObject(resourceDummyRed, null, initResult);
resourceDummyRedType = resourceDummyRed.asObjectable();
dummyResourceCtlRed.setResource(resourceDummyRed);
ResourceCarefulAntUtil.initAnts(ants, RESOURCE_DUMMY_FILE, prismContext);
descriptionAnt = ants.get(0);
InternalMonitor.reset();
InternalMonitor.setTraceShadowFetchOperation(true);
InternalMonitor.setTraceResourceSchemaOperations(true);
InternalsConfig.encryptionChecks = false;
InternalMonitor.setTracePrismObjectClone(true);
}
/**
* MID-3424
*/
@Test
public void test050GetResourceRaw() throws Exception {
final String TEST_NAME = "test050GetResourceRaw";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
rememberPrismObjectCloneCount();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createRaw());
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options , task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess("getObject result", result);
display("Resource", resource);
assertPrismObjectCloneIncrement(1);
assertResourceDummy(resource, false);
assertNull("Schema sneaked in", ResourceTypeUtil.getResourceXsdSchema(resource));
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(1);
}
/**
* MID-3424
*/
@Test
public void test052GetResourceNoFetch() throws Exception {
final String TEST_NAME = "test052GetResourceNoFetch";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
rememberPrismObjectCloneCount();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(
GetOperationOptions.createNoFetch());
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options,
task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess("getObject result", result);
display("Resource", resource);
assertPrismObjectCloneIncrement(1);
assertResourceDummy(resource, false);
assertNull("Schema sneaked in", ResourceTypeUtil.getResourceXsdSchema(resource));
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
}
/**
* MID-3424
*/
@Test
public void test053GetResourceNoFetchReadOnly() throws Exception {
final String TEST_NAME = "test053GetResourceNoFetchReadOnly";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
rememberPrismObjectCloneCount();
GetOperationOptions option = GetOperationOptions.createNoFetch();
option.setReadOnly(true);
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(option);
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options,
task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess("getObject result", result);
display("Resource", resource);
assertPrismObjectCloneIncrement(0);
assertResourceDummy(resource, false);
assertNull("Schema sneaked in", ResourceTypeUtil.getResourceXsdSchema(resource));
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
}
/**
* MID-3424
*/
@Test
public void test100SearchResourcesNoFetch() throws Exception {
final String TEST_NAME = "test100SearchResourcesNoFetch";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertSteadyResources();
rememberPrismObjectCloneCount();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch());
// WHEN
TestUtil.displayWhen(TEST_NAME);
List<PrismObject<ResourceType>> resources = modelService.searchObjects(ResourceType.class, null, options, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
assertNotNull("null search return", resources);
assertFalse("Empty search return", resources.isEmpty());
assertEquals("Unexpected number of resources found", 2, resources.size());
result.computeStatus();
TestUtil.assertSuccess("searchObjects result", result);
assertPrismObjectCloneIncrement(2);
for (PrismObject<ResourceType> resource: resources) {
assertResource(resource, false);
}
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
assertSteadyResources();
}
/**
* MID-3424
*/
@Test
public void test102SearchResourcesNoFetchReadOnly() throws Exception {
final String TEST_NAME = "test102SearchResourcesNoFetchReadOnly";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertSteadyResources();
rememberPrismObjectCloneCount();
GetOperationOptions option = GetOperationOptions.createNoFetch();
option.setReadOnly(true);
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(option);
// WHEN
TestUtil.displayWhen(TEST_NAME);
List<PrismObject<ResourceType>> resources = modelService.searchObjects(ResourceType.class, null, options, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
assertNotNull("null search return", resources);
assertFalse("Empty search return", resources.isEmpty());
assertEquals("Unexpected number of resources found", 2, resources.size());
result.computeStatus();
TestUtil.assertSuccess("searchObjects result", result);
assertPrismObjectCloneIncrement(0);
for (PrismObject<ResourceType> resource: resources) {
assertResource(resource, false);
}
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
assertSteadyResources();
}
/**
* MID-3424
*/
@Test
public void test105SearchResourcesIterativeNoFetch() throws Exception {
final String TEST_NAME = "test105SearchResourcesIterativeNoFetch";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertSteadyResources();
rememberPrismObjectCloneCount();
final List<PrismObject<ResourceType>> resources = new ArrayList<PrismObject<ResourceType>>();
ResultHandler<ResourceType> handler = (resource, parentResult) -> {
assertResource(resource, false);
resources.add(resource);
return true;
};
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch());
// WHEN
TestUtil.displayWhen(TEST_NAME);
modelService.searchObjectsIterative(ResourceType.class, null, handler, options, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess("searchObjects result", result);
assertFalse("Empty search return", resources.isEmpty());
assertEquals("Unexpected number of resources found", 2, resources.size());
assertPrismObjectCloneIncrement(2);
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
assertSteadyResources();
}
/**
* MID-3424
*/
@Test
public void test107SearchResourcesIterativeNoFetchReadOnly() throws Exception {
final String TEST_NAME = "test107SearchResourcesIterativeNoFetchReadOnly";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertSteadyResources();
rememberPrismObjectCloneCount();
final List<PrismObject<ResourceType>> resources = new ArrayList<PrismObject<ResourceType>>();
ResultHandler<ResourceType> handler = (resource, parentResult) -> {
assertResource(resource, false);
resources.add(resource);
return true;
};
GetOperationOptions option = GetOperationOptions.createNoFetch();
option.setReadOnly(true);
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(option);
// WHEN
TestUtil.displayWhen(TEST_NAME);
modelService.searchObjectsIterative(ResourceType.class, null, handler, options, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess("searchObjects result", result);
assertFalse("Empty search return", resources.isEmpty());
assertEquals("Unexpected number of resources found", 2, resources.size());
assertPrismObjectCloneIncrement(2);
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
assertSteadyResources();
}
@Test
public void test110GetResourceDummy() throws Exception {
final String TEST_NAME = "test110GetResourceDummy";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
rememberPrismObjectCloneCount();
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null , task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess("getObject result", result);
assertPrismObjectCloneIncrement(4);
assertResourceDummy(resource, true);
assertResourceSchemaFetchIncrement(1);
assertResourceSchemaParseCountIncrement(1);
assertConnectorCapabilitiesFetchIncrement(1);
assertConnectorInitializationCountIncrement(1);
assertConnectorSchemaParseIncrement(0);
IntegrationTestTools.displayXml("Initialized dummy resource", resource);
}
@Test
public void test112GetResourceDummyReadOnly() throws Exception {
final String TEST_NAME = "test112GetResourceDummyReadOnly";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
rememberPrismObjectCloneCount();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(
GetOperationOptions.createReadOnly());
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID,
options , task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess("getObject result", result);
assertPrismObjectCloneIncrement(1);
assertResourceDummy(resource, true);
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
IntegrationTestTools.displayXml("Initialized dummy resource", resource);
}
@Test
public void test120SearchResources() throws Exception {
final String TEST_NAME = "test120SearchResources";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertSteadyResources();
// WHEN
TestUtil.displayWhen(TEST_NAME);
List<PrismObject<ResourceType>> resources = modelService.searchObjects(ResourceType.class, null, null, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
assertNotNull("null search return", resources);
assertFalse("Empty search return", resources.isEmpty());
assertEquals("Unexpected number of resources found", 2, resources.size());
result.computeStatus();
TestUtil.assertSuccess("searchObjects result", result);
for (PrismObject<ResourceType> resource: resources) {
assertResource(resource, true);
}
assertResourceSchemaFetchIncrement(1);
assertResourceSchemaParseCountIncrement(1);
assertConnectorCapabilitiesFetchIncrement(1);
assertConnectorInitializationCountIncrement(1);
assertConnectorSchemaParseIncrement(0);
}
@Test
public void test125SearchResourcesIterative() throws Exception {
final String TEST_NAME = "test125SearchResourcesIterative";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertSteadyResources();
final List<PrismObject<ResourceType>> resources = new ArrayList<PrismObject<ResourceType>>();
ResultHandler<ResourceType> handler = (resource, parentResult) -> {
assertResource(resource, true);
resources.add(resource);
return true;
};
// WHEN
modelService.searchObjectsIterative(ResourceType.class, null, handler, null, task, result);
// THEN
result.computeStatus();
TestUtil.assertSuccess("searchObjects result", result);
assertFalse("Empty search return", resources.isEmpty());
assertEquals("Unexpected number of resources found", 2, resources.size());
assertSteadyResources();
}
private void assertResourceDummy(PrismObject<ResourceType> resource, boolean expectSchema) {
assertResource(resource, expectSchema);
PrismContainer<ConnectorConfigurationType> configurationContainer = resource.findContainer(ResourceType.F_CONNECTOR_CONFIGURATION);
PrismContainerDefinition<ConnectorConfigurationType> configurationContainerDefinition = configurationContainer.getDefinition();
assertDummyConfigurationContainerDefinition(configurationContainerDefinition, "from container");
PrismContainer<Containerable> configurationPropertiesContainer = configurationContainer.findContainer(SchemaConstants.CONNECTOR_SCHEMA_CONFIGURATION_PROPERTIES_ELEMENT_QNAME);
assertNotNull("No container "+SchemaConstants.CONNECTOR_SCHEMA_CONFIGURATION_PROPERTIES_ELEMENT_QNAME, configurationPropertiesContainer);
assertConfigurationPropertyDefinition(configurationPropertiesContainer,
"uselessString", DOMUtil.XSD_STRING, 0, 1, "UI_INSTANCE_USELESS_STRING", "UI_INSTANCE_USELESS_STRING_HELP");
PrismContainerDefinition<Containerable> configurationPropertiesContainerDefinition = configurationContainerDefinition.findContainerDefinition(SchemaConstants.CONNECTOR_SCHEMA_CONFIGURATION_PROPERTIES_ELEMENT_QNAME);
configurationPropertiesContainerDefinition = configurationPropertiesContainer.getDefinition();
assertNotNull("No container definition in "+configurationPropertiesContainer);
assertConfigurationPropertyDefinition(configurationPropertiesContainerDefinition,
"uselessString", DOMUtil.XSD_STRING, 0, 1, "UI_INSTANCE_USELESS_STRING", "UI_INSTANCE_USELESS_STRING_HELP");
PrismObjectDefinition<ResourceType> objectDefinition = resource.getDefinition();
assertNotNull("No object definition in resource", objectDefinition);
PrismContainerDefinition<ConnectorConfigurationType> configurationContainerDefinitionFromObjectDefinition = objectDefinition.findContainerDefinition(ResourceType.F_CONNECTOR_CONFIGURATION);
assertDummyConfigurationContainerDefinition(configurationContainerDefinitionFromObjectDefinition, "from object definition");
}
private void assertDummyConfigurationContainerDefinition(
PrismContainerDefinition<ConnectorConfigurationType> configurationContainerDefinition,
String desc) {
display("Dummy configuration container definition "+desc, configurationContainerDefinition);
PrismContainerDefinition<Containerable> configurationPropertiesContainerDefinition = configurationContainerDefinition.findContainerDefinition(SchemaConstants.CONNECTOR_SCHEMA_CONFIGURATION_PROPERTIES_ELEMENT_QNAME);
assertNotNull("No container definition for "+SchemaConstants.CONNECTOR_SCHEMA_CONFIGURATION_PROPERTIES_ELEMENT_QNAME+" "+desc, configurationPropertiesContainerDefinition);
assertConfigurationPropertyDefinition(configurationPropertiesContainerDefinition,
"uselessString", DOMUtil.XSD_STRING, 0, 1, "UI_INSTANCE_USELESS_STRING", "UI_INSTANCE_USELESS_STRING_HELP");
}
private void assertConfigurationPropertyDefinition(PrismContainerDefinition<Containerable> containerDefinition,
String propertyLocalName, QName expectedType, int expectedMinOccurs, int expectedMaxOccurs, String expectedDisplayName, String expectedHelp) {
QName propName = new QName(containerDefinition.getTypeName().getNamespaceURI(),propertyLocalName);
PrismPropertyDefinition propDef = containerDefinition.findPropertyDefinition(propName);
assertConfigurationPropertyDefinition(propDef, expectedType, expectedMinOccurs, expectedMaxOccurs, expectedDisplayName, expectedHelp);
}
private void assertConfigurationPropertyDefinition(PrismContainer container,
String propertyLocalName, QName expectedType, int expectedMinOccurs, int expectedMaxOccurs, String expectedDisplayName, String expectedHelp) {
QName propName = new QName(container.getDefinition().getTypeName().getNamespaceURI(),propertyLocalName);
PrismProperty prop = container.findProperty(propName);
assertNotNull("No property "+propName, prop);
PrismPropertyDefinition propDef = prop.getDefinition();
assertNotNull("No definition for property "+prop, propDef);
assertConfigurationPropertyDefinition(propDef, expectedType, expectedMinOccurs, expectedMaxOccurs, expectedDisplayName, expectedHelp);
}
private void assertConfigurationPropertyDefinition(PrismPropertyDefinition propDef, QName expectedType,
int expectedMinOccurs, int expectedMaxOccurs, String expectedDisplayName, String expectedHelp) {
PrismAsserts.assertDefinition(propDef, propDef.getName(), expectedType, expectedMinOccurs, expectedMaxOccurs);
assertEquals("Wrong displayName in "+propDef.getName()+" definition", expectedDisplayName, propDef.getDisplayName());
assertEquals("Wrong help in "+propDef.getName()+" definition", expectedHelp, propDef.getHelp());
}
private void assertResource(PrismObject<ResourceType> resource, boolean expectSchema) {
display("Resource", resource);
display("Resource def", resource.getDefinition());
PrismContainer<ConnectorConfigurationType> configurationContainer = resource.findContainer(ResourceType.F_CONNECTOR_CONFIGURATION);
assertNotNull("No Resource connector configuration def", configurationContainer);
PrismContainerDefinition<ConnectorConfigurationType> configurationContainerDefinition = configurationContainer.getDefinition();
display("Resource connector configuration def", configurationContainerDefinition);
display("Resource connector configuration def complex type def", configurationContainerDefinition.getComplexTypeDefinition());
assertNotNull("Empty Resource connector configuration def", configurationContainer.isEmpty());
assertEquals("Wrong compile-time class in Resource connector configuration in "+resource, ConnectorConfigurationType.class,
configurationContainer.getCompileTimeClass());
assertEquals("configurationContainer maxOccurs", 1, configurationContainerDefinition.getMaxOccurs());
resource.checkConsistence(true, true);
Element schema = ResourceTypeUtil.getResourceXsdSchema(resource);
if (expectSchema) {
assertNotNull("no schema in "+resource, schema);
} else {
assertNull("Unexpected schema in "+resource+": "+schema, schema);
}
}
@Test
public void test200GetResourceRawAfterSchema() throws Exception {
final String TEST_NAME = "test200GetResourceRawAfterSchema";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
assumeAssignmentPolicy(AssignmentPolicyEnforcementType.POSITIVE);
IntegrationTestTools.assertNoRepoCache();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createRaw());
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options , task, result);
// THEN
IntegrationTestTools.assertNoRepoCache();
SqlRepoTestUtil.assertVersionProgress(null, resource.getVersion());
lastVersion = resource.getVersion();
display("Initial version", lastVersion);
result.computeStatus();
TestUtil.assertSuccess("getObject result", result);
IntegrationTestTools.displayXml("Initialized dummy resource", resource);
}
@Test
public void test750GetResourceRaw() throws Exception {
final String TEST_NAME = "test750GetResourceRaw";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
// precondition
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
rememberPrismObjectCloneCount();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createRaw());
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, options , task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess("getObject result", result);
display("Resource", resource);
IntegrationTestTools.displayXml("Initialized dummy resource", resource);
assertPrismObjectCloneIncrement(1);
assertResourceDummy(resource, true);
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
}
@Test
public void test752GetResourceDummy() throws Exception {
final String TEST_NAME = "test752GetResourceDummy";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
rememberPrismObjectCloneCount();
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null , task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
assertPrismObjectCloneIncrement(1);
assertResourceDummy(resource, true);
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(0);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
IntegrationTestTools.displayXml("Initialized dummy resource", resource);
}
@Test
public void test760ModifyConfiguration() throws Exception {
final String TEST_NAME = "test760ModifyConfiguration";
TestUtil.displayTestTile(this, TEST_NAME);
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
ItemPath propPath = new ItemPath(ResourceType.F_CONNECTOR_CONFIGURATION, SchemaConstants.ICF_CONFIGURATION_PROPERTIES,
IntegrationTestTools.RESOURCE_DUMMY_CONFIGURATION_USELESS_STRING_ELEMENT_NAME);
PrismPropertyDefinition<String> propDef = new PrismPropertyDefinitionImpl<>(IntegrationTestTools.RESOURCE_DUMMY_CONFIGURATION_USELESS_STRING_ELEMENT_NAME,
DOMUtil.XSD_STRING, prismContext);
PropertyDelta<String> propDelta = PropertyDelta.createModificationReplaceProperty(propPath, propDef, "whatever wherever");
ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createModifyDelta(RESOURCE_DUMMY_OID, propDelta, ResourceType.class, prismContext);
display("Resource delta", resourceDelta);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta);
// WHEN
TestUtil.displayWhen(TEST_NAME);
modelService.executeChanges(deltas, null, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<ResourceType> resourceAfter = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result);
PrismAsserts.assertPropertyValue(resourceAfter, propPath, "whatever wherever");
}
@Test
public void test800GetResourceDummy() throws Exception {
final String TEST_NAME = "test800GetResourceDummy";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
preTestCleanup(AssignmentPolicyEnforcementType.POSITIVE);
rememberPrismObjectCloneCount();
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null , task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
assertPrismObjectCloneIncrement(1);
assertResourceDummy(resource, true);
assertResourceSchemaFetchIncrement(0);
assertResourceSchemaParseCountIncrement(1);
assertConnectorCapabilitiesFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorSchemaParseIncrement(0);
IntegrationTestTools.displayXml("Initialized dummy resource", resource);
}
@Test
public void test820SingleDescriptionModify() throws Exception {
final String TEST_NAME = "test820SingleDescriptionModify";
TestUtil.displayTestTile(this, TEST_NAME);
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
singleModify(descriptionAnt, -1, task, result);
}
@Test
public void test840RadomModifySequence() throws Exception {
final String TEST_NAME = "test840RadomModifySequence";
TestUtil.displayTestTile(this, TEST_NAME);
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
for(int i=0; i <= MAX_RANDOM_SEQUENCE_ITERATIONS; i++) {
singleRandomModify(i, task, result);
}
}
private void singleRandomModify(int iteration, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ObjectAlreadyExistsException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException {
int i = rnd.nextInt(ants.size());
CarefulAnt<ResourceType> ant = ants.get(i);
singleModify(ant, iteration, task, result);
}
private void singleModify(CarefulAnt<ResourceType> ant, int iteration, Task task, OperationResult result) throws SchemaException, ObjectAlreadyExistsException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException {
// GIVEN
ItemDelta<?,?> itemDelta = ant.createDelta(iteration);
ObjectDelta<ResourceType> objectDelta = ObjectDelta.createModifyDelta(RESOURCE_DUMMY_OID, itemDelta, ResourceType.class, prismContext);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(objectDelta);
IntegrationTestTools.assertNoRepoCache();
ModelExecuteOptions options = ModelExecuteOptions.createRaw();
// WHEN
modelService.executeChanges(deltas, options , task, result);
// THEN
IntegrationTestTools.assertNoRepoCache();
Collection<SelectorOptions<GetOperationOptions>> getOptions = SelectorOptions.createCollection(GetOperationOptions.createRaw());
PrismObject<ResourceType> resourceAfter = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, getOptions, task, result);
SqlRepoTestUtil.assertVersionProgress(lastVersion, resourceAfter.getVersion());
lastVersion = resourceAfter.getVersion();
display("Version", lastVersion);
Element xsdSchema = ResourceTypeUtil.getResourceXsdSchema(resourceAfter);
if (xsdSchema != null) {
String targetNamespace = xsdSchema.getAttribute("targetNamespace");
assertNotNull("No targetNamespace in schema after application of "+objectDelta, targetNamespace);
}
IntegrationTestTools.assertNoRepoCache();
ant.assertModification(resourceAfter, iteration);
}
private void preTestCleanup(AssignmentPolicyEnforcementType enforcementPolicy) throws ObjectNotFoundException, SchemaException, ObjectAlreadyExistsException {
assumeAssignmentPolicy(enforcementPolicy);
dummyAuditService.clear();
prepareNotifications();
rememberShadowFetchOperationCount();
}
}