/*
* 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.negative;
import static com.evolveum.midpoint.test.IntegrationTestTools.display;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import java.io.File;
import java.util.Collection;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
import com.evolveum.icf.dummy.resource.BreakMode;
import com.evolveum.icf.dummy.resource.DummyAccount;
import com.evolveum.icf.dummy.resource.DummyResource;
import com.evolveum.midpoint.model.intest.AbstractConfiguredModelIntegrationTest;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ResultHandler;
import com.evolveum.midpoint.schema.SearchResultList;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
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.MiscUtil;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SystemException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType;
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.OperationResultStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
/**
* Tests the model service contract by using a broken CSV resource. Tests for negative test cases, mostly
* correct handling of connector exceptions.
*
* @author semancik
*
*/
@ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class TestBrokenResources extends AbstractConfiguredModelIntegrationTest {
private static final String TEST_DIR = "src/test/resources/negative";
private static final String TEST_TARGET_DIR = "target/test/negative";
private static final File CONNECTOR_DUMMY_NOJARS_FILE = new File (TEST_DIR, "connector-dummy-nojars.xml");
private static final String CONNECTOR_DUMMY_NOJARS_OID = "cccccccc-cccc-cccc-cccc-666600660004";
private static final String RESOURCE_CSVFILE_BROKEN_FILENAME = TEST_DIR + "/resource-csvfile-broken.xml";
private static final String RESOURCE_CSVFILE_BROKEN_OID = "ef2bc95b-76e0-48e2-86d6-3d4f02d3bbbb";
private static final String RESOURCE_CSVFILE_NOTFOUND_FILENAME = TEST_DIR + "/resource-csvfile-notfound.xml";
private static final String RESOURCE_CSVFILE_NOTFOUND_OID = "ef2bc95b-76e0-48e2-86d6-f0f002d3f0f0";
private static final String RESOURCE_DUMMY_NOJARS_FILENAME = TEST_DIR + "/resource-dummy-nojars.xml";
private static final String RESOURCE_DUMMY_NOJARS_OID = "10000000-0000-0000-0000-666600660004";
private static final File RESOURCE_DUMMY_WRONG_CONNECTOR_OID_FILE = new File (TEST_DIR, "resource-dummy-wrong-connector-oid.xml");
private static final String RESOURCE_DUMMY_WRONG_CONNECTOR_OID_OID = "10000000-0000-0000-0000-666600660005";
private static final File RESOURCE_DUMMY_NO_CONFIGURATION_FILE = new File (TEST_DIR, "resource-dummy-no-configuration.xml");
private static final String RESOURCE_DUMMY_NO_CONFIGURATION_OID = "10000000-0000-0000-0000-666600660006";
private static final File RESOURCE_DUMMY_UNACCESSIBLE_FILE = new File (TEST_DIR, "resource-dummy-unaccessible.xml");
private static final String RESOURCE_DUMMY_UNACCESSIBLE_NAME = "unaccessible";
private static final String RESOURCE_DUMMY_UNACCESSIBLE_OID = "10000000-0000-0000-0000-666600660007";
private static final String ACCOUNT_SHADOW_JACK_CSVFILE_FILENAME = TEST_DIR + "/account-shadow-jack-csvfile.xml";
private static final String ACCOUNT_SHADOW_JACK_CSVFILE_OID = "ef2bc95b-76e0-1111-d3ad-3d4f12120001";
private static final String ACCOUNT_SHADOW_MURRAY_CSVFILE_FILENAME = TEST_DIR + "/account-shadow-murray-csvfile.xml";
private static final String ACCOUNT_SHADOW_MURRAY_CSVFILE_OID = "ef2bc95b-76e0-1111-d3ad-3d4f12120666";
private static final String BROKEN_CSV_FILE_NAME = "broken.csv";
private static final String BROKEN_CSV_SOURCE_FILE_NAME = TEST_DIR + "/" + BROKEN_CSV_FILE_NAME;
private static final String BROKEN_CSV_TARGET_FILE_NAME = TEST_TARGET_DIR + "/" + BROKEN_CSV_FILE_NAME;
protected static final Trace LOGGER = TraceManager.getTrace(TestBrokenResources.class);
protected UserType userTypeJack;
@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);
LOGGER.trace("initSystem");
// Resources
File targetDir = new File(TEST_TARGET_DIR);
if (!targetDir.exists()) {
targetDir.mkdirs();
}
MiscUtil.copyFile(new File(BROKEN_CSV_SOURCE_FILE_NAME), new File(BROKEN_CSV_TARGET_FILE_NAME));
repoAddObjectFromFile(CONNECTOR_DUMMY_NOJARS_FILE, initResult);
initDummyResourcePirate(null, RESOURCE_DUMMY_FILE, RESOURCE_DUMMY_OID, initTask, initResult);
initDummyResourcePirate(RESOURCE_DUMMY_UNACCESSIBLE_NAME, null, null, initTask, initResult);
importObjectFromFile(RESOURCE_CSVFILE_BROKEN_FILENAME, initResult);
importObjectFromFile(RESOURCE_CSVFILE_NOTFOUND_FILENAME, initResult);
importObjectFromFile(RESOURCE_DUMMY_NOJARS_FILENAME, initResult);
repoAddObjectFromFile(SECURITY_POLICY_FILE, initResult);
// Accounts
repoAddObjectFromFile(ACCOUNT_SHADOW_MURRAY_CSVFILE_FILENAME, initResult);
// Users
userTypeJack = repoAddObjectFromFile(USER_JACK_FILE, UserType.class, initResult).asObjectable();
assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE);
}
@Override
public void postInitSystem(Task initTask, OperationResult initResult) throws Exception {
super.postInitSystem(initTask, initResult);
// Break it only after resource are reset in super.postInitSystem()
getDummyResource(RESOURCE_DUMMY_UNACCESSIBLE_NAME).setBreakMode(BreakMode.NETWORK);
}
@Test
public void test010TestResourceBroken() throws Exception {
final String TEST_NAME = "test010TestResourceBroken";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
OperationResult testResult = modelService.testResource(RESOURCE_CSVFILE_BROKEN_OID, task);
// THEN
display("testResource result", testResult);
TestUtil.assertSuccess("testResource result", testResult);
}
@Test
public void test020GetResourceBroken() throws Exception {
final String TEST_NAME = "test020GetResourceBroken";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_CSVFILE_BROKEN_OID, null, task, result);
// THEN
display("getObject resource", resource);
result.computeStatus();
display("getObject result", result);
TestUtil.assertSuccess("getObject result", result);
OperationResultType fetchResult = resource.asObjectable().getFetchResult();
TestUtil.assertSuccess("resource.fetchResult", fetchResult);
// TODO: better asserts
assertNotNull("Null resource", resource);
}
@Test
public void test030ListResources() throws Exception {
final String TEST_NAME = "test030ListResources";
testListResources(TEST_NAME, 4, null);
}
@Test
public void test100GetAccountMurray() throws Exception {
final String TEST_NAME = "test100GetAccountMurray";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
try {
// WHEN
PrismObject<ShadowType> account = modelService.getObject(ShadowType.class, ACCOUNT_SHADOW_MURRAY_CSVFILE_OID,
null, task, result);
display("Account (unexpected)", account);
AssertJUnit.fail("Expected SystemException but the operation was successful");
} catch (SystemException e) {
// This is expected
display("Expected exception", e);
result.computeStatus();
display("getObject result", result);
TestUtil.assertFailure("getObject result", result);
}
}
@Test
public void test101GetAccountMurrayNoFetch() throws Exception {
final String TEST_NAME = "test101GetAccountMurrayNoFetch";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createNoFetch());
// WHEN
PrismObject<ShadowType> account = modelService.getObject(ShadowType.class, ACCOUNT_SHADOW_MURRAY_CSVFILE_OID,
options, task, result);
display("getObject account", account);
result.computeStatus();
display("getObject result", result);
TestUtil.assertSuccess("getObject result", result);
// TODO: better asserts
assertNotNull("Null resource", account);
}
@Test
public void test102GetAccountMurrayRaw() throws Exception {
TestUtil.displayTestTile(this, "test102GetAccountMurrayRaw");
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + ".test102GetAccountMurrayRaw");
OperationResult result = task.getResult();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createRaw());
// WHEN
PrismObject<ShadowType> account = modelService.getObject(ShadowType.class, ACCOUNT_SHADOW_MURRAY_CSVFILE_OID,
options, task, result);
display("getObject account", account);
result.computeStatus();
display("getObject result", result);
TestUtil.assertSuccess("getObject result", result);
// TODO: better asserts
assertNotNull("Null resource", account);
}
@Test
public void test120SearchAccountByUsernameJack() throws Exception {
TestUtil.displayTestTile(this, "test120SearchAccountByUsernameJack");
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + ".test120SearchAccountByUsernameJack");
OperationResult result = task.getResult();
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_CSVFILE_BROKEN_OID, null, task, result);
try {
// WHEN
PrismObject<ShadowType> account = findAccountByUsername("jack", resource, task, result);
AssertJUnit.fail("Expected SystemException but the operation was successful");
} catch (SystemException e) {
// This is expected
result.computeStatus();
display("findAccountByUsername result", result);
TestUtil.assertFailure("findAccountByUsername result", result);
}
}
@Test
public void test210TestResourceNotFound() throws Exception {
TestUtil.displayTestTile(this, "test210TestResourceNotFound");
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + ".test210TestResourceNotFound");
OperationResult result = task.getResult();
// WHEN
OperationResult testResult = modelService.testResource(RESOURCE_CSVFILE_NOTFOUND_OID, task);
// THEN
display("testResource result", testResult);
TestUtil.assertFailure("testResource result", testResult);
}
@Test
public void test220GetResourceNotFound() throws Exception {
final String TEST_NAME = "test220GetResourceNotFound";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "."+TEST_NAME);
OperationResult result = task.getResult();
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_CSVFILE_NOTFOUND_OID, null, task, result);
// THEN
display("getObject resource", resource);
result.computeStatus();
display("getObject result", result);
assertEquals("Expected partial errror in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
OperationResultType fetchResult = resource.asObjectable().getFetchResult();
display("resource.fetchResult", fetchResult);
assertEquals("Expected partial errror in fetchResult", OperationResultStatusType.PARTIAL_ERROR, fetchResult.getStatus());
// TODO: better asserts
assertNotNull("Null resource", resource);
}
@Test
public void test221GetResourceNotFoundResolveConnector() throws Exception {
final String TEST_NAME = "test221GetResourceNotFoundResolveConnector";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "."+TEST_NAME);
OperationResult result = task.getResult();
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(
ResourceType.F_CONNECTOR_REF, GetOperationOptions.createResolve());
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_CSVFILE_NOTFOUND_OID, options, task, result);
// THEN
display("getObject resource", resource);
result.computeStatus();
display("getObject result", result);
assertEquals("Expected partial errror in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
OperationResultType fetchResult = resource.asObjectable().getFetchResult();
display("resource.fetchResult", fetchResult);
assertEquals("Expected partial errror in fetchResult", OperationResultStatusType.PARTIAL_ERROR, fetchResult.getStatus());
// TODO: better asserts
assertNotNull("Null resource", resource);
assertNotNull("Connector was not resolved", resource.asObjectable().getConnector());
}
@Test
public void test310TestResourceNoJars() throws Exception {
TestUtil.displayTestTile(this, "test310TestResourceNoJars");
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + ".test310TestResourceNoJars");
// WHEN
OperationResult testResult = modelService.testResource(RESOURCE_DUMMY_NOJARS_OID, task);
// THEN
display("testResource result", testResult);
TestUtil.assertFailure("testResource result", testResult);
}
@Test
public void test320GetResourceNoJars() throws Exception {
final String TEST_NAME = "test320GetResourceNoJars";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_NOJARS_OID, null, task, result);
// THEN
display("getObject resource", resource);
result.computeStatus();
display("getObject result", result);
assertEquals("Expected partial errror in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
OperationResultType fetchResult = resource.asObjectable().getFetchResult();
display("resource.fetchResult", fetchResult);
assertEquals("Expected partial errror in fetchResult", OperationResultStatusType.PARTIAL_ERROR, fetchResult.getStatus());
// TODO: better asserts
assertNotNull("Null resource", resource);
}
@Test
public void test350AddResourceWrongConnectorOid() throws Exception {
final String TEST_NAME = "test350AddResourceWrongConnectorOid";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
PrismObject<ResourceType> resource = PrismTestUtil.parseObject(RESOURCE_DUMMY_WRONG_CONNECTOR_OID_FILE);
ObjectDelta<ResourceType> delta = ObjectDelta.createAddDelta(resource);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(delta);
try {
// WHEN
modelService.executeChanges(deltas, null, task, result);
AssertJUnit.fail("Unexpected success");
} catch (ObjectNotFoundException e) {
// This is expected
}
// THEN
result.computeStatus();
display(result);
TestUtil.assertFailure(result);
}
/**
* Even "raw" add should fail. No connector object means no connector schema which means no
* definitions for configuration properties which means we are not able to store them.
*/
@Test
public void test352AddResourceWrongConnectorOidRaw() throws Exception {
final String TEST_NAME = "test352AddResourceWrongConnectorOidRaw";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
PrismObject<ResourceType> resource = PrismTestUtil.parseObject(RESOURCE_DUMMY_WRONG_CONNECTOR_OID_FILE);
ObjectDelta<ResourceType> delta = ObjectDelta.createAddDelta(resource);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(delta);
try {
// WHEN
modelService.executeChanges(deltas, null, task, result);
AssertJUnit.fail("Unexpected success");
} catch (ObjectNotFoundException e) {
// This is expected
}
// THEN
result.computeStatus();
display(result);
TestUtil.assertFailure(result);
}
/**
* Store directly to repo. This is not really a test, it is more like a hack to prepare
* environment for next tests.
*/
@Test
public void test355AddResourceWrongConnectorOidRepo() throws Exception {
final String TEST_NAME = "test355AddResourceWrongConnectorOidRepo";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
PrismObject<ResourceType> resource = PrismTestUtil.parseObject(RESOURCE_DUMMY_WRONG_CONNECTOR_OID_FILE);
// WHEN
repositoryService.addObject(resource, null, result);
// THEN
result.computeStatus();
TestUtil.assertSuccess(result);
}
@Test
public void test358GetResourceWrongConnectorOid() throws Exception {
final String TEST_NAME = "test358GetResourceWrongConnectorOid";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_WRONG_CONNECTOR_OID_OID, null, task, result);
// THEN
display("getObject resource", resource);
result.computeStatus();
display("getObject result", result);
assertEquals("Expected partial errror in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
OperationResultType fetchResult = resource.asObjectable().getFetchResult();
display("resource.fetchResult", fetchResult);
assertEquals("Expected partial errror in fetchResult", OperationResultStatusType.PARTIAL_ERROR, fetchResult.getStatus());
// TODO: better asserts
assertNotNull("Null resource", resource);
}
@Test
public void test359DeleteResourceWrongConnectorOid() throws Exception {
final String TEST_NAME = "test359DeleteResourceWrongConnectorOid";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
ObjectDelta<ResourceType> delta = ObjectDelta.createDeleteDelta(ResourceType.class, RESOURCE_DUMMY_WRONG_CONNECTOR_OID_OID, prismContext);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(delta);
// WHEN
modelService.executeChanges(deltas, null, task, result);
// THEN
result.computeStatus();
display("getObject result", result);
assertEquals("Expected partial errror in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
assertNoObject(ResourceType.class, RESOURCE_DUMMY_WRONG_CONNECTOR_OID_OID, task, result);
}
@Test
public void test360AddResourceNoConfiguration() throws Exception {
final String TEST_NAME = "test360AddResourceNoConfiguration";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
PrismObject<ResourceType> resource = PrismTestUtil.parseObject(RESOURCE_DUMMY_NO_CONFIGURATION_FILE);
PrismObject<ConnectorType> connectorDummy = findConnectorByTypeAndVersion(CONNECTOR_DUMMY_TYPE, CONNECTOR_DUMMY_VERSION, result);
resource.asObjectable().getConnectorRef().setOid(connectorDummy.getOid());
ObjectDelta<ResourceType> delta = ObjectDelta.createAddDelta(resource);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(delta);
// WHEN
modelService.executeChanges(deltas, null, task, result);
// THEN
result.computeStatus();
TestUtil.assertSuccess(result);
}
@Test
public void test362GetResourceNoConfiguration() throws Exception {
final String TEST_NAME = "test362GetResourceNoConfiguration";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_NO_CONFIGURATION_OID, null, task, result);
// THEN
display("getObject resource", resource);
result.computeStatus();
display("getObject result", result);
assertEquals("Expected partial errror in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
OperationResultType fetchResult = resource.asObjectable().getFetchResult();
display("resource.fetchResult", fetchResult);
assertEquals("Expected partial errror in fetchResult", OperationResultStatusType.PARTIAL_ERROR, fetchResult.getStatus());
// TODO: better asserts
assertNotNull("Null resource", resource);
}
@Test
public void test368ListResources() throws Exception {
final String TEST_NAME = "test368ListResources";
testListResources(TEST_NAME, 5, null);
}
@Test
public void test369DeleteResourceNoConfiguration() throws Exception {
final String TEST_NAME = "test369DeleteResourceNoConfiguration";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
ObjectDelta<ResourceType> delta = ObjectDelta.createDeleteDelta(ResourceType.class, RESOURCE_DUMMY_NO_CONFIGURATION_OID, prismContext);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(delta);
// WHEN
modelService.executeChanges(deltas, null, task, result);
// THEN
result.computeStatus();
display("getObject result", result);
TestUtil.assertSuccess(result);
assertNoObject(ResourceType.class, RESOURCE_DUMMY_NO_CONFIGURATION_OID, task, result);
}
@Test
public void test370ListResources() throws Exception {
final String TEST_NAME = "test370ListResources";
testListResources(TEST_NAME, 4, null);
}
@Test
public void test371ImportUnaccessibleResource() throws Exception {
final String TEST_NAME = "test371ImportUnaccessibleResource";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
// WHEN
importObjectFromFile(RESOURCE_DUMMY_UNACCESSIBLE_FILE, task, result);
// THEN
result.computeStatus();
TestUtil.assertSuccess(result);
}
/**
* No fetch operation should NOT try to read the schema.
* MID-3509
*/
@Test
public void test372GetUnaccessibleResourceNoFetch() throws Exception {
final String TEST_NAME = "test372GetUnaccessibleResourceNoFetch";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
rememberResourceSchemaFetchCount();
rememberConnectorInitializationCount();
rememberConnectorOperationCount();
rememberConnectorSchemaParseCount();
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_UNACCESSIBLE_OID,
GetOperationOptions.createNoFetchCollection(), task, result);
// THEN
result.computeStatus();
TestUtil.assertSuccess(result);
display("Resource after", resource);
assertNotNull("No resource", resource);
assertResourceSchemaFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorOperationIncrement(0);
assertConnectorSchemaParseIncrement(0);
}
/**
* No fetch operation should NOT try to read the schema.
* MID-3509
*/
@Test
public void test374ListResourcesNoFetch() throws Exception {
final String TEST_NAME = "test374ListResourcesNoFetch";
rememberResourceSchemaFetchCount();
rememberConnectorInitializationCount();
rememberConnectorOperationCount();
rememberConnectorSchemaParseCount();
testListResources(TEST_NAME, 5, GetOperationOptions.createNoFetchCollection());
assertResourceSchemaFetchIncrement(0);
assertConnectorInitializationCountIncrement(0);
assertConnectorOperationIncrement(0);
assertConnectorSchemaParseIncrement(0);
}
@Test
public void test375ListResources() throws Exception {
final String TEST_NAME = "test375ListResources";
testListResources(TEST_NAME, 5, null);
}
@Test
public void test377GetResourceNoConfiguration() throws Exception {
final String TEST_NAME = "test377GetResourceNoConfiguration";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
// WHEN
PrismObject<ResourceType> resource = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_UNACCESSIBLE_OID, null, task, result);
// THEN
display("getObject resource", resource);
result.computeStatus();
display("getObject result", result);
assertEquals("Expected partial errror in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
OperationResultType fetchResult = resource.asObjectable().getFetchResult();
display("resource.fetchResult", fetchResult);
assertEquals("Expected partial errror in fetchResult", OperationResultStatusType.PARTIAL_ERROR, fetchResult.getStatus());
assertNotNull("Null resource", resource);
}
/**
* Assign two resources to a user. One of them is looney, the other is not. The result should be that
* the account on the good resource is created.
*
* This one dies on the lack of schema.
*/
// MID-1248
@Test
public void test400AssignTwoResouresNotFound() throws Exception {
testAssignTwoResoures("test400AssignTwoResoures", RESOURCE_CSVFILE_NOTFOUND_OID);
}
/**
* Assign two resources to a user. One of them is looney, the other is not. The result should be that
* the account on the good resource is created.
*
* This one dies on connector error.
*/
@Test
public void test401AssignTwoResouresBroken() throws Exception {
testAssignTwoResoures("test401AssignTwoResouresBroken", RESOURCE_CSVFILE_BROKEN_OID);
}
/**
* Assign two resources to a user. One of them is looney, the other is not. The result should be that
* the account on the good resource is created.
*/
private void testAssignTwoResoures(final String TEST_NAME, String badResourceOid) throws Exception {
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
assumeAssignmentPolicy(AssignmentPolicyEnforcementType.POSITIVE);
ObjectDelta<UserType> userDelta = createAccountAssignmentUserDelta(USER_JACK_OID, badResourceOid, null, true);
userDelta.addModification(createAccountAssignmentModification(RESOURCE_DUMMY_OID, null, true));
display("input delta", userDelta);
Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(userDelta);
// WHEN
modelService.executeChanges(deltas, null, task, result);
// THEN
result.computeStatus();
display("executeChanges result", result);
//TODO: ugly hack, see MID-1248
if ("test401AssignTwoResouresBroken".equals(TEST_NAME)){
assertEquals("Expected partial error in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
}
DummyAccount jackDummyAccount = getDummyResource().getAccountByUsername(USER_JACK_USERNAME);
assertNotNull("No jack dummy account", jackDummyAccount);
}
public void testListResources(final String TEST_NAME, int expectedNumber, Collection<SelectorOptions<GetOperationOptions>> options) throws Exception {
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN (1)
Task task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
// WHEN (1)
final SearchResultList<PrismObject<ResourceType>> resources = modelService.searchObjects(ResourceType.class, null, options, task, result);
// THEN (1)
result.computeStatus();
display("getObject result", result);
if (options == null) {
assertEquals("Expected partial error (search)", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
} else if (GetOperationOptions.isNoFetch(SelectorOptions.findRootOptions(options))) {
TestUtil.assertSuccess(result);
} else {
AssertJUnit.fail("unexpected");
}
display("Got resources: "+resources);
assertEquals("Wrong number of resources", expectedNumber, resources.size());
// GIVEN (2)
resources.clear();
task = taskManager.createTaskInstance(TestBrokenResources.class.getName() + "." + TEST_NAME);
result = task.getResult();
ResultHandler<ResourceType> handler = new ResultHandler<ResourceType>() {
@Override
public boolean handle(PrismObject<ResourceType> object, OperationResult parentResult) {
resources.add(object);
return true;
}
};
// WHEN (2)
modelService.searchObjectsIterative(ResourceType.class, null, handler, options, task, result);
// THEN (2)
result.computeStatus();
display("getObject result", result);
if (options == null) {
assertEquals("Expected partial error (searchIterative)", OperationResultStatus.PARTIAL_ERROR, result.getStatus());
} else if (GetOperationOptions.isNoFetch(SelectorOptions.findRootOptions(options))) {
TestUtil.assertSuccess(result);
} else {
AssertJUnit.fail("unexpected");
}
display("Got resources: "+resources);
assertEquals("Wrong number of resources", expectedNumber, resources.size());
}
}