/* * 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 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.util.Collection; import java.util.List; 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.PrismObject; import com.evolveum.midpoint.prism.PrismReference; import com.evolveum.midpoint.prism.delta.DiffUtil; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; 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.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.ConnectorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; /** * Test various connector change and usage scenarios with dummy connector and * fake dummy connector. Test upgrades and downgrades of connector version. * * @author semancik * */ @ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestConnectorDummyFake extends AbstractConfiguredModelIntegrationTest { private String connectorDummyOid; private String connectorDummyFakeOid; private PrismObject<ResourceType> resourceDummy; private PrismObject<ResourceType> resourceDummyFake; private DummyResourceContoller dummyResourceCtl; protected static DummyResource dummyResource; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { // Make sure that the connectors are discovered modelService.postInit(initResult); // Make sure to call postInit first. This add system config to repo. // If system is initialized after that then the logging config from system config // will be used instead of test logging config super.initSystem(initTask, initResult); dummyResourceCtl = DummyResourceContoller.create(null, resourceDummy); dummyResourceCtl.extendSchemaPirate(); dummyResource = dummyResourceCtl.getDummyResource(); dummyResourceCtl.addAccount(ACCOUNT_HERMAN_DUMMY_USERNAME, "Herman Toothrot"); dummyResourceCtl.addAccount(ACCOUNT_GUYBRUSH_DUMMY_USERNAME, "Guybrush Threepwood"); dummyResourceCtl.addAccount(ACCOUNT_JACK_DUMMY_USERNAME, "Jack Sparrow"); } @Test public void test010ListConnectors() throws Exception { final String TEST_NAME = "test010ListConnectors"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); // WHEN List<PrismObject<ConnectorType>> connectors = modelService.searchObjects(ConnectorType.class, null, null, task, result); // THEN display("Connectors", connectors); result.computeStatus(); TestUtil.assertSuccess("getObject result", result); assertEquals("Unexpected number of connectors", 8, connectors.size()); for(PrismObject<ConnectorType> connector: connectors) { display("Connector", connector); ConnectorType connectorType = connector.asObjectable(); if (CONNECTOR_DUMMY_TYPE.equals(connectorType.getConnectorType())) { String connectorVersion = connectorType.getConnectorVersion(); if (connectorVersion.contains("fake")) { display("Fake Dummy Connector OID", connector.getOid()); connectorDummyFakeOid = connector.getOid(); } else { display("Dummy Connector OID", connector.getOid()); connectorDummyOid = connector.getOid(); } } } assertNotNull("No dummy connector", connectorDummyOid); assertNotNull("No fake dummy connector", connectorDummyFakeOid); } @Test public void test020ImportFakeResource() throws Exception { final String TEST_NAME = "test020ImportFakeResource"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); // WHEN importObjectFromFile(RESOURCE_DUMMY_FAKE_FILENAME, result); // THEN result.computeStatus(); display("Import result", result); TestUtil.assertSuccess("import result", result, 2); resourceDummyFake = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, null, task, result); display("Imported resource", resourceDummyFake); assertNotNull("Null fake resource after getObject", resourceDummyFake); assertEquals("Wrong connectorRef in fake resource", connectorDummyFakeOid, resourceDummyFake.asObjectable().getConnectorRef().getOid()); } @Test public void test021TestFakeResource() throws Exception { final String TEST_NAME = "test021TestFakeResource"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); // WHEN OperationResult testResult = modelService.testResource(RESOURCE_DUMMY_FAKE_OID, task); // THEN display("testResource result", testResult); TestUtil.assertSuccess("testResource result", testResult); } @Test public void test022ListAccountsFakeResource() throws Exception { final String TEST_NAME = "test022ListAccountsFakeResource"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); // WHEN Collection<PrismObject<ShadowType>> accounts = listAccounts(resourceDummyFake, task, result); // THEN result.computeStatus(); display("listAccounts result", result); TestUtil.assertSuccess("listAccounts result", result); assertEquals("Unexpected number of accounts: "+accounts, 1, accounts.size()); } @Test public void test030ImportDummyResource() throws Exception { final String TEST_NAME = "test030ImportDummyResource"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); // WHEN importObjectFromFile(RESOURCE_DUMMY_FILE, result); // THEN result.computeStatus(); display("Import result", result); TestUtil.assertSuccess("import result", result, 2); resourceDummy = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); display("Imported resource", resourceDummy); assertNotNull("Null fake resource after getObject", resourceDummy); assertEquals("Wrong connectorRef in fake resource", connectorDummyOid, resourceDummy.asObjectable().getConnectorRef().getOid()); } @Test public void test031TestDummyResource() throws Exception { final String TEST_NAME = "test031TestDummyResource"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); // WHEN OperationResult testResult = modelService.testResource(RESOURCE_DUMMY_OID, task); // THEN display("testResource result", testResult); TestUtil.assertSuccess("testResource result", testResult); } @Test public void test032ListAccountsDummyResource() throws Exception { final String TEST_NAME = "test032ListAccountsDummyResource"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); // WHEN Collection<PrismObject<ShadowType>> accounts = listAccounts(resourceDummy, task, result); // THEN result.computeStatus(); display("listAccounts result", result); TestUtil.assertSuccess("listAccounts result", result); assertEquals("Unexpected number of accounts: "+accounts, 3, accounts.size()); } /** * Upgrading connector in RESOURCE_DUMMY_FAKE by changing the connectorRef in resource (add/delete case) * The connectorRef is changed from fake to real dummy. */ @Test public void test100UpgradeModelAddDelete() throws Exception { final String TEST_NAME = "test100UpgradeModelAddDelete"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); PrismObject<ResourceType> dummyResourceModelBefore = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createEmptyModifyDelta(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, prismContext); PrismReference connectorRef = resourceDummyFake.findReference(ResourceType.F_CONNECTOR_REF); ReferenceDelta connectorRefDeltaDel = ReferenceDelta.createModificationDelete(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorRef.getValue().clone()); resourceDelta.addModification(connectorRefDeltaDel); ReferenceDelta connectorRefDeltaAdd = ReferenceDelta.createModificationAdd(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyOid); resourceDelta.addModification(connectorRefDeltaAdd); // Purge the schema. New connector schema is not compatible. resourceDelta.addModificationReplaceContainer(ResourceType.F_SCHEMA); display("Delta", resourceDelta); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); display("executeChanges result", result); TestUtil.assertSuccess("executeChanges result", result); assertUpgrade(dummyResourceModelBefore); } @Test public void test150DowngradeModelAddDelete() throws Exception { final String TEST_NAME = "test150DowngradeModelAddDelete"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); PrismObject<ResourceType> dummyResourceModelBefore = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createEmptyModifyDelta(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, prismContext); ReferenceDelta connectorRefDeltaDel = ReferenceDelta.createModificationDelete(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyOid); resourceDelta.addModification(connectorRefDeltaDel); ReferenceDelta connectorRefDeltaAdd = ReferenceDelta.createModificationAdd(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyFakeOid); resourceDelta.addModification(connectorRefDeltaAdd); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); display("executeChanges result", result); TestUtil.assertSuccess("executeChanges result", result); assertDowngrade(dummyResourceModelBefore); } @Test public void test200UpgradeModelReplace() throws Exception { final String TEST_NAME = "test200UpgradeModelReplace"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); PrismObject<ResourceType> dummyResourceModelBefore = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createEmptyModifyDelta(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, prismContext); ReferenceDelta connectorRefDeltaReplace = ReferenceDelta.createModificationReplace(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyOid); resourceDelta.addModification(connectorRefDeltaReplace); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); display("executeChanges result", result); TestUtil.assertSuccess("executeChanges result", result); assertUpgrade(dummyResourceModelBefore); } @Test public void test250DowngradeModelReplace() throws Exception { final String TEST_NAME = "test250DowngradeModelReplace"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); PrismObject<ResourceType> dummyResourceModelBefore = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createEmptyModifyDelta(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, prismContext); ReferenceDelta connectorRefDeltaReplace = ReferenceDelta.createModificationReplace(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyFakeOid); resourceDelta.addModification(connectorRefDeltaReplace); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); display("executeChanges result", result); TestUtil.assertSuccess("executeChanges result", result); assertDowngrade(dummyResourceModelBefore); } @Test public void test300UpgradeRawAddDelete() throws Exception { final String TEST_NAME = "test300UpgradeRawAddDelete"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); PrismObject<ResourceType> dummyResourceModelBefore = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createEmptyModifyDelta(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, prismContext); ReferenceDelta connectorRefDeltaDel = ReferenceDelta.createModificationDelete(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyFakeOid); resourceDelta.addModification(connectorRefDeltaDel); ReferenceDelta connectorRefDeltaAdd = ReferenceDelta.createModificationAdd(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyOid); resourceDelta.addModification(connectorRefDeltaAdd); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta); ModelExecuteOptions options = ModelExecuteOptions.createRaw(); // WHEN modelService.executeChanges(deltas, options, task, result); // THEN result.computeStatus(); display("executeChanges result", result); TestUtil.assertSuccess("executeChanges result", result); assertUpgrade(dummyResourceModelBefore); } @Test public void test350DowngradeRawAddDelete() throws Exception { final String TEST_NAME = "test350DowngradeRawAddDelete"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); PrismObject<ResourceType> dummyResourceModelBefore = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createEmptyModifyDelta(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, prismContext); ReferenceDelta connectorRefDeltaDel = ReferenceDelta.createModificationDelete(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyOid); resourceDelta.addModification(connectorRefDeltaDel); ReferenceDelta connectorRefDeltaAdd = ReferenceDelta.createModificationAdd(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyFakeOid); resourceDelta.addModification(connectorRefDeltaAdd); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta); ModelExecuteOptions options = ModelExecuteOptions.createRaw(); // WHEN modelService.executeChanges(deltas, options, task, result); // THEN result.computeStatus(); display("executeChanges result", result); TestUtil.assertSuccess("executeChanges result", result); assertDowngrade(dummyResourceModelBefore); } @Test public void test400UpgradeRawReplace() throws Exception { final String TEST_NAME = "test400UpgradeRawReplace"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); PrismObject<ResourceType> dummyResourceModelBefore = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createEmptyModifyDelta(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, prismContext); ReferenceDelta connectorRefDeltaReplace = ReferenceDelta.createModificationReplace(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyOid); resourceDelta.addModification(connectorRefDeltaReplace); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta); ModelExecuteOptions options = ModelExecuteOptions.createRaw(); // WHEN modelService.executeChanges(deltas, options, task, result); // THEN result.computeStatus(); display("executeChanges result", result); TestUtil.assertSuccess("executeChanges result", result); assertUpgrade(dummyResourceModelBefore); } @Test public void test450DowngradeRawReplace() throws Exception { final String TEST_NAME = "test450DowngradeRawReplace"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); PrismObject<ResourceType> dummyResourceModelBefore = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); ObjectDelta<ResourceType> resourceDelta = ObjectDelta.createEmptyModifyDelta(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, prismContext); ReferenceDelta connectorRefDeltaReplace = ReferenceDelta.createModificationReplace(ResourceType.F_CONNECTOR_REF, getResourceDefinition(), connectorDummyFakeOid); resourceDelta.addModification(connectorRefDeltaReplace); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(resourceDelta); ModelExecuteOptions options = ModelExecuteOptions.createRaw(); // WHEN modelService.executeChanges(deltas, options, task, result); // THEN result.computeStatus(); display("executeChanges result", result); TestUtil.assertSuccess("executeChanges result", result); assertDowngrade(dummyResourceModelBefore); } private void assertUpgrade(PrismObject<ResourceType> dummyResourceModelBefore) throws ObjectNotFoundException, SchemaException, SecurityViolationException, ObjectAlreadyExistsException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException { Task task = taskManager.createTaskInstance(TestConnectorDummyFake.class.getName() + ".assertUpgrade"); OperationResult result = task.getResult(); // Check if the changes went well in the repo PrismObject<ResourceType> repoResource = repositoryService.getObject(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, null, result); display("Upgraded fake resource (repo)", repoResource); assertNotNull("Null fake resource after getObject (repo)", repoResource); assertEquals("Oooops. The OID of fake resource mysteriously changed. Call the police! (repo)", RESOURCE_DUMMY_FAKE_OID, repoResource.getOid()); assertEquals("Wrong connectorRef in fake resource (repo)", connectorDummyOid, repoResource.asObjectable().getConnectorRef().getOid()); // Check if resource view of the model has changed as well resourceDummyFake = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, null, task, result); display("Upgraded fake resource (model)", resourceDummyFake); Element resourceDummyFakeSchemaElement = ResourceTypeUtil.getResourceXsdSchema(resourceDummyFake); display("Upgraded fake resource schema (model)", DOMUtil.serializeDOMToString(resourceDummyFakeSchemaElement)); assertNotNull("Null fake resource after getObject (model)", resourceDummyFake); assertEquals("Oooops. The OID of fake resource mysteriously changed. Call the police! (model)", RESOURCE_DUMMY_FAKE_OID, resourceDummyFake.getOid()); assertEquals("Wrong connectorRef in fake resource (model)", connectorDummyOid, resourceDummyFake.asObjectable().getConnectorRef().getOid()); // Check if the other resource is still untouched PrismObject<ResourceType> dummyResourceModelAfter = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); dummyResourceModelBefore.asObjectable().setFetchResult(null); dummyResourceModelAfter.asObjectable().setFetchResult(null); ObjectDelta<ResourceType> dummyResourceDiff = DiffUtil.diff(dummyResourceModelBefore, dummyResourceModelAfter); display("Dummy resource diff", dummyResourceDiff); assertTrue("Ha! Someone touched the other resource! Off with his head! diff:"+dummyResourceDiff, dummyResourceDiff.isEmpty()); testResources(3,3); } private void assertDowngrade(PrismObject<ResourceType> dummyResourceModelBefore) throws ObjectNotFoundException, SchemaException, SecurityViolationException, ObjectAlreadyExistsException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException { Task task = taskManager.createTaskInstance(TestConnectorDummyFake.class.getName() + ".assertDowngrade"); OperationResult result = task.getResult(); // Check if the changes went well in the repo PrismObject<ResourceType> repoResource = repositoryService.getObject(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, null, result); display("Upgraded fake resource (repo)", repoResource); assertNotNull("Null fake resource after getObject (repo)", repoResource); assertEquals("Oooops. The OID of fake resource mysteriously changed. Call the police! (repo)", RESOURCE_DUMMY_FAKE_OID, repoResource.getOid()); assertEquals("Wrong connectorRef in fake resource (repo)", connectorDummyFakeOid, repoResource.asObjectable().getConnectorRef().getOid()); // Check if resource view of the model has changed as well resourceDummyFake = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_FAKE_OID, null, task, result); display("Upgraded fake resource (model)", resourceDummyFake); assertNotNull("Null fake resource after getObject (model)", resourceDummyFake); assertEquals("Oooops. The OID of fake resource mysteriously changed. Call the police! (model)", RESOURCE_DUMMY_FAKE_OID, resourceDummyFake.getOid()); assertEquals("Wrong connectorRef in fake resource (model)", connectorDummyFakeOid, resourceDummyFake.asObjectable().getConnectorRef().getOid()); // Check if the other resource is still untouched PrismObject<ResourceType> dummyResourceModelAfter = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, task, result); dummyResourceModelBefore.asObjectable().setFetchResult(null); dummyResourceModelAfter.asObjectable().setFetchResult(null); ObjectDelta<ResourceType> dummyResourceDiff = DiffUtil.diff(dummyResourceModelBefore, dummyResourceModelAfter); display("Dummy resource diff", dummyResourceDiff); assertTrue("Ha! Someone touched the other resource! Off with his head! diff:"+dummyResourceDiff, dummyResourceDiff.isEmpty()); testResources(3,1); } private void testResources(int numDummyAccounts, int numFakeAccounts) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { Task task = taskManager.createTaskInstance(TestConnectorDummyFake.class.getName() + ".testResources"); // We have to purge fake resource schema here. As the new connector provides a different schema purgeResourceSchema(RESOURCE_DUMMY_FAKE_OID); OperationResult testResult = modelService.testResource(RESOURCE_DUMMY_FAKE_OID, task); display("testResource fake result", testResult); TestUtil.assertSuccess("testResource fake result", testResult); testResult = modelService.testResource(RESOURCE_DUMMY_OID, task); display("testResource dummy result", testResult); TestUtil.assertSuccess("testResource dummy result", testResult); assertResourceAccounts(resourceDummy, numDummyAccounts); assertResourceAccounts(resourceDummyFake, numFakeAccounts); } private void assertResourceAccounts(PrismObject<ResourceType> resource, int numAccounts) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { Task task = taskManager.createTaskInstance(TestConnectorDummyFake.class.getName() + ".assertResourceAccounts"); OperationResult result = task.getResult(); // WHEN Collection<PrismObject<ShadowType>> accounts = listAccounts(resource, task, result); // THEN result.computeStatus(); display("listAccounts result "+resource, result); TestUtil.assertSuccess("listAccounts result "+resource, result); assertEquals("Unexpected number of accounts on "+resource+": "+accounts, numAccounts, accounts.size()); } }