diff --git a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java index 7efe29129cb..75030766531 100644 --- a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java +++ b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java @@ -32,14 +32,18 @@ import java.util.Arrays; import java.util.Collection; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.identityconnectors.common.logging.Log; import org.identityconnectors.common.security.GuardedString; import org.identityconnectors.common.security.GuardedString.Accessor; import org.identityconnectors.framework.common.objects.Attribute; +import org.identityconnectors.framework.common.objects.AttributeUtil; import org.identityconnectors.framework.common.objects.ConnectorObject; +import org.identityconnectors.framework.common.objects.ConnectorObjectBuilder; import org.identityconnectors.framework.common.objects.ObjectClass; import org.identityconnectors.framework.common.objects.ObjectClassInfo; import org.identityconnectors.framework.common.objects.ObjectClassInfoBuilder; @@ -52,8 +56,21 @@ import org.identityconnectors.framework.common.objects.SyncResultsHandler; import org.identityconnectors.framework.common.objects.SyncToken; import org.identityconnectors.framework.common.objects.Uid; +import org.identityconnectors.framework.common.objects.filter.AndFilter; +import org.identityconnectors.framework.common.objects.filter.AttributeFilter; +import org.identityconnectors.framework.common.objects.filter.ContainsAllValuesFilter; +import org.identityconnectors.framework.common.objects.filter.ContainsFilter; +import org.identityconnectors.framework.common.objects.filter.EndsWithFilter; +import org.identityconnectors.framework.common.objects.filter.EqualsFilter; import org.identityconnectors.framework.common.objects.filter.Filter; import org.identityconnectors.framework.common.objects.filter.FilterTranslator; +import org.identityconnectors.framework.common.objects.filter.GreaterThanFilter; +import org.identityconnectors.framework.common.objects.filter.GreaterThanOrEqualFilter; +import org.identityconnectors.framework.common.objects.filter.LessThanFilter; +import org.identityconnectors.framework.common.objects.filter.LessThanOrEqualFilter; +import org.identityconnectors.framework.common.objects.filter.NotFilter; +import org.identityconnectors.framework.common.objects.filter.OrFilter; +import org.identityconnectors.framework.common.objects.filter.StartsWithFilter; import org.identityconnectors.framework.spi.Configuration; import org.identityconnectors.framework.spi.Connector; import org.identityconnectors.framework.spi.ConnectorClass; @@ -915,7 +932,10 @@ public void executeQuery(ObjectClass objectClass, Filter query, ResultsHandler h Collection accounts = resource.listAccounts(); for (DummyAccount account : accounts) { ConnectorObject co = convertToConnectorObject(account, attributesToGet); - handler.handle(co); + if (matches(query, co)) { + co = filterOutAttributesToGet(co, attributesToGet); + handler.handle(co); + } } } else if (ObjectClass.GROUP.is(objectClass.getObjectClassValue())) { @@ -923,7 +943,13 @@ public void executeQuery(ObjectClass objectClass, Filter query, ResultsHandler h Collection groups = resource.listGroups(); for (DummyGroup group : groups) { ConnectorObject co = convertToConnectorObject(group, attributesToGet); - handler.handle(co); + if (matches(query, co)) { + if (attributesToGetHasAttribute(attributesToGet, DummyGroup.ATTR_MEMBERS_NAME)) { + resource.recordGroupMembersReadCount(); + } + co = filterOutAttributesToGet(co, attributesToGet); + handler.handle(co); + } } } else if (objectClass.is(OBJECTCLASS_PRIVILEGE_NAME)) { @@ -931,7 +957,10 @@ public void executeQuery(ObjectClass objectClass, Filter query, ResultsHandler h Collection privs = resource.listPrivileges(); for (DummyPrivilege priv : privs) { ConnectorObject co = convertToConnectorObject(priv, attributesToGet); - handler.handle(co); + if (matches(query, co)) { + co = filterOutAttributesToGet(co, attributesToGet); + handler.handle(co); + } } } else { @@ -949,6 +978,109 @@ public void executeQuery(ObjectClass objectClass, Filter query, ResultsHandler h log.info("executeQuery::end"); } + private boolean matches(Filter query, ConnectorObject co) { + if (query == null) { + return true; + } + if (configuration.getCaseIgnoreValues() || configuration.getCaseIgnoreId()) { + return normalize(query).accept(normalize(co)); + } + return query.accept(co); + } + + private ConnectorObject normalize(ConnectorObject co) { + ConnectorObjectBuilder cob = new ConnectorObjectBuilder(); + if (configuration.getCaseIgnoreId()) { + cob.setUid(co.getUid().getUidValue().toLowerCase()); + cob.setName(co.getName().getName().toLowerCase()); + } else { + cob.setUid(co.getUid()); + cob.setName(co.getName()); + } + cob.setObjectClass(co.getObjectClass()); + for (Attribute attr : co.getAttributes()) { + cob.addAttribute(normalize(attr)); + } + return cob.build(); + } + + private Filter normalize(Filter filter) { + if (filter instanceof ContainsFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new ContainsFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof EndsWithFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new EndsWithFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof EqualsFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new EqualsFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof GreaterThanFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new GreaterThanFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof GreaterThanOrEqualFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new GreaterThanOrEqualFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof LessThanFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new LessThanFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof LessThanOrEqualFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new LessThanOrEqualFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof StartsWithFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new StartsWithFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof ContainsAllValuesFilter) { + AttributeFilter afilter = (AttributeFilter) filter; + return new ContainsAllValuesFilter(normalize(afilter.getAttribute())); + } else if (filter instanceof NotFilter) { + NotFilter notFilter = (NotFilter) filter; + return new NotFilter(normalize(notFilter.getFilter())); + } else if (filter instanceof AndFilter) { + AndFilter andFilter = (AndFilter) filter; + return new AndFilter(normalize(andFilter.getLeft()), normalize(andFilter.getRight())); + } else if (filter instanceof OrFilter) { + OrFilter orFilter = (OrFilter) filter; + return new OrFilter(normalize(orFilter.getLeft()), normalize(orFilter.getRight())); + } else { + return filter; + } + } + + private Attribute normalize(Attribute attr) { + if (configuration.getCaseIgnoreValues()) { + AttributeBuilder ab = new AttributeBuilder(); + ab.setName(attr.getName()); + for (Object value: attr.getValue()) { + if (value instanceof String) { + ab.addValue(((String)value).toLowerCase()); + } else { + ab.addValue(value); + } + } + return ab.build(); + } else { + return attr; + } + } + + private ConnectorObject filterOutAttributesToGet(ConnectorObject co, Collection attributesToGet) { + if (attributesToGet == null) { + return co; + } + ConnectorObjectBuilder cob = new ConnectorObjectBuilder(); + cob.setUid(co.getUid()); + cob.setName(co.getName()); + cob.setObjectClass(co.getObjectClass()); + Set attrs = new HashSet(co.getAttributes().size()); + for (Attribute attr : co.getAttributes()) { + if (attributesToGet.contains(attr.getName())) { + cob.addAttribute(attr); + } + } + cob.addAttributes(attrs); + return cob.build(); + } + /** * {@inheritDoc} */ @@ -1117,24 +1249,23 @@ private ConnectorObjectBuilder createConnectorObjectBuilderCommon(DummyObject du builder.addAttribute(Name.NAME, dummyObject.getName()); for (String name : dummyObject.getAttributeNames()) { - if (attributesToGet != null) { - if (!attributesToGet.contains(name)) { - continue; - } - } else { - DummyAttributeDefinition attrDef = objectClass.getAttributeDefinition(name); - if (attrDef == null) { - throw new IllegalArgumentException("Unknown account attribute '"+name+"'"); - } - if (!attrDef.isReturnedByDefault()) { + DummyAttributeDefinition attrDef = objectClass.getAttributeDefinition(name); + if (attrDef == null) { + throw new IllegalArgumentException("Unknown account attribute '"+name+"'"); + } + if (!attrDef.isReturnedByDefault()) { + if (attributesToGet != null && !attributesToGet.contains(name)) { continue; } } + // Return all attributes that are returned by default. We will filter them out later. Set values = dummyObject.getAttributeValues(name, Object.class); if (configuration.isVaryLetterCase()) { name = varyLetterCase(name); } - builder.addAttribute(name, values); + if (values != null && !values.isEmpty()) { + builder.addAttribute(name, values); + } } if (supportActivation) { @@ -1213,7 +1344,7 @@ private ConnectorObject convertToConnectorObject(DummyGroup group, Collection attributesToGet) { ConnectorObjectBuilder builder = createConnectorObjectBuilderCommon(priv, resource.getPrivilegeObjectClass(), attributesToGet, false); @@ -1410,27 +1541,12 @@ public void access(char[] passwdChars) { } }); } - -// /* (non-Javadoc) -// * @see org.identityconnectors.framework.spi.AttributeNormalizer#normalizeAttribute(org.identityconnectors.framework.common.objects.ObjectClass, org.identityconnectors.framework.common.objects.Attribute) -// */ -// @Override -// public Attribute normalizeAttribute(ObjectClass ObjectClass, Attribute attribute) { -// if (!configuration.getCaseIgnoreId()) { -// return attribute; -// } -// String attrName = attribute.getName(); -// if (Uid.NAME.equals(attrName) || Name.NAME.equals(attrName)) { -// List values = (List) attribute.getValue(); -// AttributeBuilder builder = new AttributeBuilder(); -// builder.setName(attrName); -// for (String origVal: values) { -// builder.addValue(StringUtils.lowerCase(origVal)); -// } -// return builder.build(); -// } else { -// return attribute; -// } -// } + + private boolean attributesToGetHasAttribute(Collection attributesToGet, String attrName) { + if (attributesToGet == null) { + return true; + } + return attributesToGet.contains(attrName); + } } diff --git a/icf-connectors/dummy-resource/src/main/java/com/evolveum/icf/dummy/resource/DummyResource.java b/icf-connectors/dummy-resource/src/main/java/com/evolveum/icf/dummy/resource/DummyResource.java index b5f4cc366ff..89cbd6b7402 100644 --- a/icf-connectors/dummy-resource/src/main/java/com/evolveum/icf/dummy/resource/DummyResource.java +++ b/icf-connectors/dummy-resource/src/main/java/com/evolveum/icf/dummy/resource/DummyResource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * 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. @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Random; -import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -32,6 +31,8 @@ import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; /** * Resource for use with dummy ICF connector. @@ -65,7 +66,10 @@ * */ public class DummyResource implements DebugDumpable { + + private static final Trace LOGGER = TraceManager.getTrace(DummyResource.class); + private String instanceName; private Map allObjects; private Map accounts; private Map groups; @@ -84,6 +88,7 @@ public class DummyResource implements DebugDumpable { private boolean caseIgnoreId = false; private boolean caseIgnoreValues = false; private int connectionCount = 0; + private int groupMembersReadCount = 0; private BreakMode schemaBreakMode = BreakMode.NONE; private BreakMode getBreakMode = BreakMode.NONE; @@ -140,11 +145,20 @@ public static DummyResource getInstance(String instanceName) { DummyResource instance = instances.get(instanceName); if (instance == null) { instance = new DummyResource(); + instance.setInstanceName(instanceName); instances.put(instanceName, instance); } return instance; } + public String getInstanceName() { + return instanceName; + } + + public void setInstanceName(String instanceName) { + this.instanceName = instanceName; + } + public boolean isTolerateDuplicateValues() { return tolerateDuplicateValues; } @@ -277,6 +291,18 @@ public void assertNoConnections() { assert connectionCount == 0 : "Dummy resource: "+connectionCount+" connections still open"; } + public int getGroupMembersReadCount() { + return groupMembersReadCount; + } + + public void setGroupMembersReadCount(int groupMembersReadCount) { + this.groupMembersReadCount = groupMembersReadCount; + } + + public void recordGroupMembersReadCount() { + groupMembersReadCount++; + traceOperation("groupMembersRead", groupMembersReadCount); + } public DummyObjectClass getAccountObjectClass() throws ConnectException, FileNotFoundException { if (schemaBreakMode == BreakMode.NONE) { @@ -779,6 +805,32 @@ public List getDeltasSince(int syncToken) { return result; } + private void traceOperation(String opName, long counter) { + LOGGER.info("MONITOR dummy '{}' {} ({})", instanceName, opName, counter); + if (LOGGER.isDebugEnabled()) { + StackTraceElement[] fullStack = Thread.currentThread().getStackTrace(); + String immediateClass = null; + String immediateMethod = null; + StringBuilder sb = new StringBuilder(); + for (StackTraceElement stackElement: fullStack) { + if (stackElement.getClassName().equals(DummyResource.class.getName()) || + stackElement.getClassName().equals(Thread.class.getName())) { + // skip our own calls + continue; + } + if (immediateClass == null) { + immediateClass = stackElement.getClassName(); + immediateMethod = stackElement.getMethodName(); + } + sb.append(stackElement.toString()); + sb.append("\n"); + } + LOGGER.debug("MONITOR dummy '{}' {} ({}): {} {}", new Object[]{instanceName, opName, counter, immediateClass, immediateMethod}); + LOGGER.trace("MONITOR dummy '{}' {} ({}):\n{}", new Object[]{instanceName, opName, counter, sb}); + } + } + + @Override public String debugDump() { return debugDump(0); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java index 76249b15837..f419cdd6532 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/PrismAsserts.java @@ -739,7 +739,9 @@ public static void assertSets(String message, Collection actualValues, T. public static void assertSets(String message, MatchingRule matchingRule, Collection actualValues, T... expectedValues) { assertNotNull("Null set in " + message, actualValues); - assertEquals("Wrong number of values in " + message, expectedValues.length, actualValues.size()); + assertEquals("Wrong number of values in " + message+ "; expected (real values) " + +PrettyPrinter.prettyPrint(expectedValues)+"; has (pvalues) "+actualValues, + expectedValues.length, actualValues.size()); for (T actualValue: actualValues) { boolean found = false; for (T value: expectedValues) { diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd index b07e13f81bd..e5e4c0fbcd8 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-3.xsd @@ -4024,6 +4024,20 @@ + + + + Fetch the attribute only if absolutely necessary. + MidPoint expects that the attribute might be implicitly returned by the connector. + Therefore it will try to avoid fetching this value (if possible). + This option can be used for values that cause performance overhead (e.g. list of members + of large groups). + + + + + + diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java index 3ab13108d2f..21930fc722e 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/EntitlementConverter.java @@ -728,6 +728,7 @@ private PrismObject collectEntitlementAsObjectOperation(Prov if (ResourceTypeUtil.isAvoidDuplicateValues(resource)) { PrismObject currentObjectShadow = operations.getCurrentShadow(); if (currentObjectShadow == null) { + LOGGER.trace("Fetching etitlement shadow {} to avoid value duplication (intent={})", entitlementIdentifiers, entitlementIntent); currentObjectShadow = resourceObjectReferenceResolver.fetchResourceObject(entitlementCtx, entitlementIdentifiers, null, result); operations.setCurrentShadow(currentObjectShadow); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index 14c5526fc06..2bbb57125ba 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -982,7 +982,7 @@ private void executeEntitlements(ProvisioningContext subjectCtx, Collection operations = entry.getValue().getOperations(); // TODO: better handling of result, partial failures, etc. - executeModify(entitlementCtx, null, identifiers, operations, parentResult); + executeModify(entitlementCtx, entry.getValue().getCurrentShadow(), identifiers, operations, parentResult); } } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java index 18fd2285b9b..7051f07064e 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java @@ -297,14 +297,26 @@ public static AttributesToReturn createAttributesToReturn(ProvisioningContext ct boolean apply = false; AttributesToReturn attributesToReturn = new AttributesToReturn(); - attributesToReturn.setReturnDefaultAttributes(true); // Attributes + + boolean hasMinimal = false; + for (RefinedAttributeDefinition attributeDefinition : objectClassDefinition.getAttributeDefinitions()) { + if (attributeDefinition.getFetchStrategy() == AttributeFetchStrategyType.MINIMAL) { + hasMinimal = true; + break; + } + } + + attributesToReturn.setReturnDefaultAttributes(!hasMinimal); + Collection explicit = new ArrayList(); for (RefinedAttributeDefinition attributeDefinition : objectClassDefinition.getAttributeDefinitions()) { AttributeFetchStrategyType fetchStrategy = attributeDefinition.getFetchStrategy(); if (fetchStrategy != null && fetchStrategy == AttributeFetchStrategyType.EXPLICIT) { explicit.add(attributeDefinition); + } else if (hasMinimal && fetchStrategy != AttributeFetchStrategyType.MINIMAL) { + explicit.add(attributeDefinition); } } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/AbstractDummyTest.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/AbstractDummyTest.java index 6ebbf8cd91d..eef0a010bbc 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/AbstractDummyTest.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/AbstractDummyTest.java @@ -64,6 +64,7 @@ import com.evolveum.midpoint.provisioning.ProvisioningTestUtil; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.provisioning.impl.ConnectorManager; +import com.evolveum.midpoint.provisioning.impl.ProvisioningContextFactory; import com.evolveum.midpoint.provisioning.test.mock.SynchornizationServiceMock; import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; @@ -106,6 +107,7 @@ public abstract class AbstractDummyTest extends AbstractIntegrationTest { public static final File RESOURCE_DUMMY_FILE = new File(ProvisioningTestUtil.COMMON_TEST_DIR_FILE, "resource-dummy.xml"); public static final String RESOURCE_DUMMY_OID = "ef2bc95b-76e0-59e2-86d6-9999dddddddd"; public static final String RESOURCE_DUMMY_NS = "http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd"; + public static final String RESOURCE_DUMMY_INTENT_GROUP = "group"; protected static final String RESOURCE_DUMMY_NONEXISTENT_OID = "ef2bc95b-000-000-000-009900dddddd"; @@ -178,6 +180,9 @@ public abstract class AbstractDummyTest extends AbstractIntegrationTest { @Autowired(required = true) protected MatchingRuleRegistry matchingRuleRegistry; + @Autowired(required = true) + protected ProvisioningContextFactory provisioningContextFactory; + // Values used to check if something is unchanged or changed properly private Long lastResourceVersion = null; private ConnectorInstance lastConfiguredConnectorInstance; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java index 8a4c71e2535..de2ebf176cb 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java @@ -91,9 +91,12 @@ import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.provisioning.ProvisioningTestUtil; import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; +import com.evolveum.midpoint.provisioning.impl.ProvisioningContext; import com.evolveum.midpoint.provisioning.test.ucf.TestUcfDummy; +import com.evolveum.midpoint.provisioning.ucf.api.AttributesToReturn; import com.evolveum.midpoint.provisioning.ucf.api.ConnectorInstance; import com.evolveum.midpoint.provisioning.ucf.impl.ConnectorFactoryIcfImpl; +import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; import com.evolveum.midpoint.schema.CapabilityUtil; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -205,6 +208,10 @@ protected String getDrakeRepoIcfName() { return DRAKE_USERNAME; } + protected boolean isAvoidDuplicateValues() { + return false; + } + @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); @@ -947,6 +954,35 @@ public void test050SelfTest() throws Exception { // The account must exist to test this with modify delta. So we postpone the // test when the account actually exists + @Test + public void test080TestAttributesToReturn() throws Exception { + final String TEST_NAME = "test080TestAttributesToReturn"; + TestUtil.displayTestTile(TEST_NAME); + + // GIVEN + Task task = taskManager.createTaskInstance(); + OperationResult result = task.getResult(); + + ResourceShadowDiscriminator coords = new ResourceShadowDiscriminator(RESOURCE_DUMMY_OID, ShadowKindType.ENTITLEMENT, RESOURCE_DUMMY_INTENT_GROUP); + ProvisioningContext ctx = provisioningContextFactory.create(coords, task, result); + + // WHEN + AttributesToReturn attributesToReturn = ProvisioningUtil.createAttributesToReturn(ctx); + + // THEN + display("attributesToReturn", attributesToReturn); + assertFalse("wrong isReturnDefaultAttributes", attributesToReturn.isReturnDefaultAttributes()); + Collection attrs = new ArrayList<>(); + for (ResourceAttributeDefinition attributeToReturnDef: attributesToReturn.getAttributesToReturn()) { + attrs.add(attributeToReturnDef.getName().getLocalPart()); + } + // No "memebers" attribute here + PrismAsserts.assertSets("Wrong attribute to return", attrs, "uid", "name", "description", "cc"); + + assertSteadyResource(); + } + + @Test public void test100AddAccount() throws Exception { final String TEST_NAME = "test100AddAccount"; @@ -2603,6 +2639,8 @@ public void test200AddGroup() throws Exception { PrismObject group = prismContext.parseObject(new File(GROUP_PIRATES_FILENAME)); group.checkConsistence(); + + rememberDummyResourceGroupMembersReadCount(null); display("Adding group", group); @@ -2616,6 +2654,7 @@ public void test200AddGroup() throws Exception { assertEquals(GROUP_PIRATES_OID, addedObjectOid); group.checkConsistence(); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); ShadowType groupRepoType = repositoryService.getObject(ShadowType.class, GROUP_PIRATES_OID, null, result) .asObjectable(); @@ -2624,12 +2663,15 @@ public void test200AddGroup() throws Exception { assertEquals("Wrong kind (repo)", ShadowKindType.ENTITLEMENT, groupRepoType.getKind()); syncServiceMock.assertNotifySuccessOnly(); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); ShadowType groupProvisioningType = provisioningService.getObject(ShadowType.class, GROUP_PIRATES_OID, null, task, result).asObjectable(); display("group from provisioning", groupProvisioningType); checkGroupPirates(groupProvisioningType, result); piratesIcfUid = getIcfUid(groupRepoType); + + assertDummyResourceGroupMembersReadCountIncrement(null, 0); // Check if the group was created in the dummy resource @@ -2646,8 +2688,9 @@ public void test200AddGroup() throws Exception { ProvisioningTestUtil.checkRepoEntitlementShadow(shadowFromRepo); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); checkConsistency(group); - + assertDummyResourceGroupMembersReadCountIncrement(null, 0); assertSteadyResource(); } @@ -2659,6 +2702,8 @@ public void test202GetGroup() throws Exception { OperationResult result = new OperationResult(TestDummy.class.getName() + "." + TEST_NAME); + rememberDummyResourceGroupMembersReadCount(null); + // WHEN ShadowType shadow = provisioningService.getObject(ShadowType.class, GROUP_PIRATES_OID, null, null, result).asObjectable(); @@ -2671,6 +2716,8 @@ public void test202GetGroup() throws Exception { display("Retrieved group shadow", shadow); assertNotNull("No dummy group", shadow); + + assertDummyResourceGroupMembersReadCountIncrement(null, 0); checkGroupPirates(shadow, result); @@ -2703,6 +2750,8 @@ public void test203GetGroupNoFetch() throws Exception { rootOptions.setNoFetch(true); Collection> options = SelectorOptions.createCollection(rootOptions); + rememberDummyResourceGroupMembersReadCount(null); + // WHEN ShadowType shadow = provisioningService.getObject(ShadowType.class, GROUP_PIRATES_OID, options, null, result).asObjectable(); @@ -2715,6 +2764,8 @@ public void test203GetGroupNoFetch() throws Exception { display("Retrieved group shadow", shadow); assertNotNull("No dummy group", shadow); + + assertDummyResourceGroupMembersReadCountIncrement(null, 0); checkGroupShadow(shadow, result, false); @@ -2732,6 +2783,7 @@ public void test205ModifyGroupReplace() throws Exception { + "." + TEST_NAME); OperationResult result = task.getResult(); + rememberDummyResourceGroupMembersReadCount(null); syncServiceMock.reset(); ObjectDelta delta = ObjectDelta.createModificationReplaceProperty(ShadowType.class, @@ -2753,6 +2805,12 @@ public void test205ModifyGroupReplace() throws Exception { delta.checkConsistence(); DummyGroup group = getDummyGroupAssert(GROUP_PIRATES_NAME, piratesIcfUid); assertDummyAttributeValues(group, DummyResourceContoller.DUMMY_GROUP_ATTRIBUTE_DESCRIPTION, "Bloodthirsty pirates"); + + if (isAvoidDuplicateValues()) { + assertDummyResourceGroupMembersReadCountIncrement(null, 1); + } else { + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + } syncServiceMock.assertNotifySuccessOnly(); assertSteadyResource(); @@ -2865,6 +2923,8 @@ public void test214AddPrivilegeBargain() throws Exception { PrismObject priv = prismContext.parseObject(new File(PRIVILEGE_BARGAIN_FILENAME)); priv.checkConsistence(); + + rememberDummyResourceGroupMembersReadCount(null); display("Adding priv", priv); @@ -2878,6 +2938,7 @@ public void test214AddPrivilegeBargain() throws Exception { assertEquals(PRIVILEGE_BARGAIN_OID, addedObjectOid); priv.checkConsistence(); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); ShadowType groupRepoType = repositoryService.getObject(ShadowType.class, PRIVILEGE_BARGAIN_OID, null, result) .asObjectable(); @@ -2885,12 +2946,15 @@ public void test214AddPrivilegeBargain() throws Exception { assertEquals("Wrong kind (repo)", ShadowKindType.ENTITLEMENT, groupRepoType.getKind()); syncServiceMock.assertNotifySuccessOnly(); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); ShadowType privProvisioningType = provisioningService.getObject(ShadowType.class, PRIVILEGE_BARGAIN_OID, null, task, result).asObjectable(); display("priv from provisioning", privProvisioningType); checkPrivBargain(privProvisioningType, result); bargainIcfUid = getIcfUid(privProvisioningType); + + assertDummyResourceGroupMembersReadCountIncrement(null, 0); // Check if the group was created in the dummy resource @@ -2906,6 +2970,7 @@ public void test214AddPrivilegeBargain() throws Exception { ProvisioningTestUtil.checkRepoEntitlementShadow(shadowFromRepo); checkConsistency(priv); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); assertSteadyResource(); } @@ -2930,6 +2995,7 @@ public void test220EntitleAccountWillPirates() throws Exception { + "." + TEST_NAME); OperationResult result = task.getResult(); + rememberDummyResourceGroupMembersReadCount(null); syncServiceMock.reset(); ObjectDelta delta = IntegrationTestTools.createEntitleDelta(ACCOUNT_WILL_OID, @@ -2950,11 +3016,17 @@ public void test220EntitleAccountWillPirates() throws Exception { TestUtil.assertSuccess(result); delta.checkConsistence(); + if (isAvoidDuplicateValues()) { + assertDummyResourceGroupMembersReadCountIncrement(null, 1); + } else { + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + } + DummyGroup group = getDummyGroupAssert(GROUP_PIRATES_NAME, piratesIcfUid); assertMember(group, transformNameFromResource(getWillRepoIcfName())); syncServiceMock.assertNotifySuccessOnly(); - + assertDummyResourceGroupMembersReadCountIncrement(null, 0); assertSteadyResource(); } @@ -2970,6 +3042,7 @@ public void test221GetPirateWill() throws Exception { + "." + TEST_NAME); OperationResult result = task.getResult(); + rememberDummyResourceGroupMembersReadCount(null); syncServiceMock.reset(); // WHEN @@ -2982,12 +3055,14 @@ public void test221GetPirateWill() throws Exception { display(result); TestUtil.assertSuccess(result); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); assertEntitlementGroup(account, GROUP_PIRATES_OID); // Just make sure nothing has changed DummyGroup group = getDummyGroupAssert(GROUP_PIRATES_NAME, piratesIcfUid); assertMember(group, transformNameFromResource(getWillRepoIcfName())); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); assertSteadyResource(); } @@ -3000,6 +3075,7 @@ public void test222EntitleAccountWillPillage() throws Exception { + "." + TEST_NAME); OperationResult result = task.getResult(); + rememberDummyResourceGroupMembersReadCount(null); syncServiceMock.reset(); ObjectDelta delta = IntegrationTestTools.createEntitleDelta(ACCOUNT_WILL_OID, @@ -3017,23 +3093,28 @@ public void test222EntitleAccountWillPillage() throws Exception { display("modifyObject result", result); TestUtil.assertSuccess(result); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + DummyAccount dummyAccount = getDummyAccountAssert(transformNameFromResource(ACCOUNT_WILL_USERNAME), willIcfUid); assertNotNull("Account will is gone!", dummyAccount); Set accountProvileges = dummyAccount.getAttributeValues(DummyAccount.ATTR_PRIVILEGES_NAME, String.class); PrismAsserts.assertSets("account privileges", accountProvileges, PRIVILEGE_PILLAGE_NAME); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + // Make sure that privilege object is still there DummyPrivilege priv = getDummyPrivilegeAssert(PRIVILEGE_PILLAGE_NAME, pillageIcfUid); assertNotNull("Privilege object is gone!", priv); delta.checkConsistence(); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); // Make sure that the groups is still there and will is a member DummyGroup group = getDummyGroupAssert(GROUP_PIRATES_NAME, piratesIcfUid); assertMember(group, transformNameFromResource(getWillRepoIcfName())); syncServiceMock.assertNotifySuccessOnly(); - + assertDummyResourceGroupMembersReadCountIncrement(null, 0); assertSteadyResource(); } @@ -3097,6 +3178,7 @@ public void test223GetPillagingPirateWill() throws Exception { + "." + TEST_NAME); OperationResult result = task.getResult(); + rememberDummyResourceGroupMembersReadCount(null); syncServiceMock.reset(); // WHEN @@ -3113,12 +3195,16 @@ public void test223GetPillagingPirateWill() throws Exception { assertEntitlementPriv(account, PRIVILEGE_PILLAGE_OID); assertEntitlementPriv(account, PRIVILEGE_BARGAIN_OID); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + // Just make sure nothing has changed DummyAccount dummyAccount = getDummyAccountAssert(transformNameFromResource(ACCOUNT_WILL_USERNAME), willIcfUid); assertNotNull("Account will is gone!", dummyAccount); Set accountProvileges = dummyAccount.getAttributeValues(DummyAccount.ATTR_PRIVILEGES_NAME, String.class); PrismAsserts.assertSets("Wrong account privileges", accountProvileges, PRIVILEGE_PILLAGE_NAME, PRIVILEGE_BARGAIN_NAME); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + // Make sure that privilege object is still there DummyPrivilege priv = getDummyPrivilegeAssert(PRIVILEGE_PILLAGE_NAME, pillageIcfUid); assertNotNull("Privilege object is gone!", priv); @@ -3128,6 +3214,7 @@ public void test223GetPillagingPirateWill() throws Exception { DummyGroup group = getDummyGroupAssert(GROUP_PIRATES_NAME, piratesIcfUid); assertMember(group, transformNameFromResource(getWillRepoIcfName())); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); assertSteadyResource(); } @@ -3151,6 +3238,7 @@ public void test224GetFoolishPirateWill() throws Exception { groupFools.addMember(transformNameFromResource(ACCOUNT_WILL_USERNAME)); syncServiceMock.reset(); + rememberDummyResourceGroupMembersReadCount(null); rememberConnectorOperationCount(); // WHEN @@ -3164,13 +3252,19 @@ public void test224GetFoolishPirateWill() throws Exception { TestUtil.assertSuccess(result); assertConnectorOperationIncrement(2); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + PrismObject foolsShadow = findShadowByName(new QName(RESOURCE_DUMMY_NS, OBJECTCLAS_GROUP_LOCAL_NAME), "fools", resource, result); assertNotNull("No shadow for group fools", foolsShadow); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + assertEntitlementGroup(account, GROUP_PIRATES_OID); assertEntitlementGroup(account, foolsShadow.getOid()); assertEntitlementPriv(account, PRIVILEGE_PILLAGE_OID); assertEntitlementPriv(account, PRIVILEGE_BARGAIN_OID); + + assertDummyResourceGroupMembersReadCountIncrement(null, 0); // Just make sure nothing has changed DummyAccount dummyAccount = getDummyAccountAssert(transformNameFromResource(ACCOUNT_WILL_USERNAME), willIcfUid); @@ -3184,6 +3278,8 @@ public void test224GetFoolishPirateWill() throws Exception { DummyPrivilege priv2 = getDummyPrivilegeAssert(PRIVILEGE_BARGAIN_NAME, bargainIcfUid); assertNotNull("Privilege object (bargain) is gone!", priv2); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + DummyGroup group = getDummyGroupAssert(GROUP_PIRATES_NAME, piratesIcfUid); assertMember(group, transformNameFromResource(getWillRepoIcfName())); @@ -3191,6 +3287,7 @@ public void test224GetFoolishPirateWill() throws Exception { groupFools = getDummyGroupAssert("fools", foolsIcfUid); assertMember(group, transformNameFromResource(getWillRepoIcfName())); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); assertSteadyResource(); } @@ -3203,6 +3300,7 @@ public void test228DetitleAccountWillPirates() throws Exception { + "." + TEST_NAME); OperationResult result = task.getResult(); + rememberDummyResourceGroupMembersReadCount(null); syncServiceMock.reset(); ObjectDelta delta = IntegrationTestTools.createDetitleDelta(ACCOUNT_WILL_OID, @@ -3221,6 +3319,12 @@ public void test228DetitleAccountWillPirates() throws Exception { TestUtil.assertSuccess(result); delta.checkConsistence(); + if (isAvoidDuplicateValues()) { + assertDummyResourceGroupMembersReadCountIncrement(null, 1); + } else { + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + } + DummyGroup group = getDummyGroupAssert(GROUP_PIRATES_NAME, piratesIcfUid); assertNoMember(group, getWillRepoIcfName()); @@ -3230,12 +3334,15 @@ public void test228DetitleAccountWillPirates() throws Exception { Set accountProvileges = dummyAccount.getAttributeValues(DummyAccount.ATTR_PRIVILEGES_NAME, String.class); PrismAsserts.assertSets("Wrong account privileges", accountProvileges, PRIVILEGE_PILLAGE_NAME, PRIVILEGE_BARGAIN_NAME); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); + // Make sure that privilege object is still there DummyPrivilege priv = getDummyPrivilegeAssert(PRIVILEGE_PILLAGE_NAME, pillageIcfUid); assertNotNull("Privilege object is gone!", priv); DummyPrivilege priv2 = getDummyPrivilegeAssert(PRIVILEGE_BARGAIN_NAME, bargainIcfUid); assertNotNull("Privilege object (bargain) is gone!", priv2); + assertDummyResourceGroupMembersReadCountIncrement(null, 0); syncServiceMock.assertNotifySuccessOnly(); assertSteadyResource(); } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyCaseIgnore.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyCaseIgnore.java index f476e445551..056bb4f2b42 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyCaseIgnore.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyCaseIgnore.java @@ -96,6 +96,11 @@ protected MatchingRule getUidMatchingRule() { return uidMatchingRule; } + @Override + protected boolean isAvoidDuplicateValues() { + return true; + } + @Test public void test175SearchUidCase() throws Exception { final String TEST_NAME = "test175SearchUidCase"; diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJ.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJ.java index e1c2eac5ba0..e075821dd7d 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJ.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestOpenDJ.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * 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. diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/ucf/TestUcfDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/ucf/TestUcfDummy.java index 0bd147b6a11..3bccd2d831a 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/ucf/TestUcfDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/ucf/TestUcfDummy.java @@ -194,7 +194,7 @@ public void test001ResourceSanity() throws ObjectNotFoundException, SchemaExcept assertContainerDefinition(configurationContainer, "configuration", ConnectorConfigurationType.COMPLEX_TYPE, 1, 1); PrismContainerValue configContainerValue = configurationContainer.getValue(); List> configItems = configContainerValue.getItems(); - assertEquals("Wrong number of config items", 1, configItems.size()); + assertEquals("Wrong number of config items", 2, configItems.size()); PrismContainer dummyConfigPropertiesContainer = configurationContainer.findContainer( ConnectorFactoryIcfImpl.CONNECTOR_SCHEMA_CONFIGURATION_PROPERTIES_ELEMENT_QNAME); diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-case-ignore-upcase-name/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-case-ignore-upcase-name/resource-dummy.xml index 57d3d63a859..35af57ecb06 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-case-ignore-upcase-name/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-case-ignore-upcase-name/resource-dummy.xml @@ -43,10 +43,10 @@ - - true - true - + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -152,6 +152,7 @@ ri:members mr:stringIgnoreCase + minimal diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-case-ignore/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-case-ignore/resource-dummy.xml index 4580e1255c4..d295d6c4752 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-case-ignore/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-case-ignore/resource-dummy.xml @@ -1,6 +1,6 @@ - true - true - + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -143,6 +143,7 @@ ri:members mr:stringIgnoreCase + minimal diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-extra/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-extra/resource-dummy.xml index bff79802654..0cde9e3e703 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-extra/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-extra/resource-dummy.xml @@ -40,6 +40,12 @@ true true + + + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -192,6 +198,10 @@ group true ri:GroupObjectClass + + ri:members + minimal + entitlement @@ -200,7 +210,4 @@ ri:CustomprivilegeObjectClass - - true - diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-hacks/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-hacks/resource-dummy.xml index d5ef0259700..4098205aaa5 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-hacks/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-hacks/resource-dummy.xml @@ -40,6 +40,12 @@ Dead men tell no tales + + + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-no-activation/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-no-activation/resource-dummy.xml index e272a4b0281..e675c545551 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-no-activation/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-no-activation/resource-dummy.xml @@ -40,6 +40,12 @@ Dead men tell no tales + + + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -176,6 +182,10 @@ group true ri:GroupObjectClass + + ri:members + minimal + entitlement @@ -184,7 +194,4 @@ ri:CustomprivilegeObjectClass - - true - diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-priorities-read-replace/resource-dummy-all-read-replace.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-priorities-read-replace/resource-dummy-all-read-replace.xml index d2127ada432..183d752ab1d 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-priorities-read-replace/resource-dummy-all-read-replace.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-priorities-read-replace/resource-dummy-all-read-replace.xml @@ -40,6 +40,12 @@ true + + + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -187,6 +193,10 @@ group true ri:GroupObjectClass + + ri:members + minimal + false diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-priorities-read-replace/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-priorities-read-replace/resource-dummy.xml index 4d299c6007a..22828cf88b1 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-priorities-read-replace/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-priorities-read-replace/resource-dummy.xml @@ -39,6 +39,12 @@ true + + + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -181,6 +187,10 @@ group true ri:GroupObjectClass + + ri:members + minimal + entitlement diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-schemaless/resource-dummy-schemaless-no-schema.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-schemaless/resource-dummy-schemaless-no-schema.xml index 48121680806..d6830c46a9b 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-schemaless/resource-dummy-schemaless-no-schema.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-schemaless/resource-dummy-schemaless-no-schema.xml @@ -31,6 +31,12 @@ schemaless false + + + false + false + false + diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-schemaless/resource-dummy-schemaless-static-schema.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-schemaless/resource-dummy-schemaless-static-schema.xml index fb42a22196e..cfb99dc6e3f 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-schemaless/resource-dummy-schemaless-static-schema.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-schemaless/resource-dummy-schemaless-static-schema.xml @@ -32,6 +32,12 @@ staticSchema false + + + false + false + false + diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-uuid-nonunique-name/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-uuid-nonunique-name/resource-dummy.xml index c798de72295..707619c1fd8 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-uuid-nonunique-name/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-uuid-nonunique-name/resource-dummy.xml @@ -39,6 +39,12 @@ true + + + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -127,6 +133,10 @@ group true ri:GroupObjectClass + + ri:members + minimal + entitlement @@ -135,7 +145,4 @@ ri:CustomprivilegeObjectClass - - true - diff --git a/provisioning/provisioning-impl/src/test/resources/impl/dummy-uuid/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/impl/dummy-uuid/resource-dummy.xml index 86dc2fc7d7f..9f57f29d0e0 100644 --- a/provisioning/provisioning-impl/src/test/resources/impl/dummy-uuid/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/impl/dummy-uuid/resource-dummy.xml @@ -38,6 +38,12 @@ true + + + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -126,6 +132,10 @@ group true ri:GroupObjectClass + + ri:members + minimal + entitlement @@ -134,7 +144,4 @@ ri:CustomprivilegeObjectClass - - true - diff --git a/provisioning/provisioning-impl/src/test/resources/logback-test.xml b/provisioning/provisioning-impl/src/test/resources/logback-test.xml index 1dbe3d5f264..7aca100e4df 100644 --- a/provisioning/provisioning-impl/src/test/resources/logback-test.xml +++ b/provisioning/provisioning-impl/src/test/resources/logback-test.xml @@ -36,6 +36,8 @@ + + diff --git a/provisioning/provisioning-impl/src/test/resources/object/resource-dummy.xml b/provisioning/provisioning-impl/src/test/resources/object/resource-dummy.xml index c6f8ce6de0f..c7f7729a588 100644 --- a/provisioning/provisioning-impl/src/test/resources/object/resource-dummy.xml +++ b/provisioning/provisioning-impl/src/test/resources/object/resource-dummy.xml @@ -39,6 +39,12 @@ true + + + false + false + false + http://midpoint.evolveum.com/xml/ns/public/resource/instance/ef2bc95b-76e0-59e2-86d6-9999dddddddd @@ -175,6 +181,10 @@ group true ri:GroupObjectClass + + ri:members + minimal + entitlement @@ -183,7 +193,4 @@ ri:CustomprivilegeObjectClass - - true - diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java index c3db5c58fe2..19a7bd7a7bd 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java @@ -20,6 +20,7 @@ import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; +import com.evolveum.icf.dummy.resource.DummyResource; import com.evolveum.midpoint.common.Clock; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.common.monitor.CachingStatistics; @@ -141,6 +142,7 @@ public abstract class AbstractIntegrationTest extends AbstractTestNGSpringContex private long lastScriptExecutionCount = 0; private long lastConnectorOperationCount = 0; private long lastConnectorSimulatedPagingSearchCount = 0; + private long lastDummyResourceGroupMembersReadCount = 0; @Autowired(required = true) @Qualifier("cacheRepositoryService") @@ -755,8 +757,6 @@ protected void assertScriptExecutionIncrement(int expectedIncrement) { lastScriptExecutionCount = currentCount; } - - protected void rememberConnectorOperationCount() { lastConnectorOperationCount = InternalMonitor.getConnectorOperationCount(); } @@ -830,6 +830,17 @@ protected void assertShadowFetchOperationCountIncrement(int expectedIncrement) { lastShadowFetchOperationCount = currentCount; } + protected void rememberDummyResourceGroupMembersReadCount(String instanceName) { + lastDummyResourceGroupMembersReadCount = DummyResource.getInstance(instanceName).getGroupMembersReadCount(); + } + + protected void assertDummyResourceGroupMembersReadCountIncrement(String instanceName, int expectedIncrement) { + long currentDummyResourceGroupMembersReadCount = DummyResource.getInstance(instanceName).getGroupMembersReadCount(); + long actualIncrement = currentDummyResourceGroupMembersReadCount - lastDummyResourceGroupMembersReadCount; + assertEquals("Unexpected increment in group members read count count in dummy resource '"+instanceName+"'", (long)expectedIncrement, actualIncrement); + lastDummyResourceGroupMembersReadCount = currentDummyResourceGroupMembersReadCount; + } + protected PrismObject createShadow(PrismObject resource, String id) throws SchemaException { return createShadow(resource, id, id); }