diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java index da2a5ca9f0c..c05bb640954 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/result/OperationResult.java @@ -454,35 +454,18 @@ public void computeStatus() { } if (sub.getStatus() == OperationResultStatus.PARTIAL_ERROR) { newStatus = OperationResultStatus.PARTIAL_ERROR; -// if (message == null) { -// message = sub.getMessage(); -// } else { -// message = message + ": " + sub.getMessage(); -// } newMessage = sub.getMessage(); -// newMessage = sub.getMessage(); -// return; } if (newStatus != OperationResultStatus.PARTIAL_ERROR){ if (sub.getStatus() == OperationResultStatus.HANDLED_ERROR) { newStatus = OperationResultStatus.HANDLED_ERROR; -// if (message == null) { - newMessage = sub.getMessage(); -// } else { -// message = message + ": " + sub.getMessage(); -// } -// return; + newMessage = sub.getMessage(); } } if (sub.getStatus() != OperationResultStatus.SUCCESS -// && sub.getStatus() != OperationResultStatus.HANDLED_ERROR && sub.getStatus() != OperationResultStatus.NOT_APPLICABLE) { allSuccess = false; } -// if (sub.getStatus() == OperationResultStatus.PARTIAL_ERROR) { -// newStatus = OperationResultStatus.PARTIAL_ERROR; -// newMessage = sub.getMessage(); -// } if (newStatus != OperationResultStatus.HANDLED_ERROR) { if (sub.getStatus() == OperationResultStatus.WARNING) { newStatus = OperationResultStatus.WARNING; @@ -505,6 +488,63 @@ public void computeStatus() { } } } + + /** + * Used when the result contains several composite sub-result that are of equivalent meaning. + * If all of them fails the result will be fatal error as well. If only some of them fail the + * result will be partial error. Handled error is considered a success. + */ + public void computeStatusComposite() { + if (getSubresults().isEmpty()) { + if (status == OperationResultStatus.UNKNOWN) { + status = OperationResultStatus.SUCCESS; + } + return; + } + + boolean allOk = true; + boolean allNotApplicable = true; + boolean hasInProgress = false; + for (OperationResult sub : getSubresults()) { + if (sub.getStatus() != OperationResultStatus.NOT_APPLICABLE) { + allNotApplicable = false; + } + if (sub.getStatus() == OperationResultStatus.FATAL_ERROR) { + allOk = false; + if (message == null) { + message = sub.getMessage(); + } else { + message = message + ", " + sub.getMessage(); + } + } + if (sub.getStatus() == OperationResultStatus.IN_PROGRESS) { + hasInProgress = true; + if (message == null) { + message = sub.getMessage(); + } else { + message = message + ", " + sub.getMessage(); + } + } + if (sub.getStatus() == OperationResultStatus.PARTIAL_ERROR) { + allOk = false; + if (message == null) { + message = sub.getMessage(); + } else { + message = message + ", " + sub.getMessage(); + } + } + } + + if (allNotApplicable) { + status = OperationResultStatus.NOT_APPLICABLE; + } else if (allOk) { + status = OperationResultStatus.SUCCESS; + } else if (hasInProgress) { + status = OperationResultStatus.IN_PROGRESS; + } else { + status = OperationResultStatus.PARTIAL_ERROR; + } + } public OperationResultStatus getComputeStatus() { OperationResultStatus origStatus = status; @@ -545,6 +585,12 @@ public void recordSuccessIfUnknown() { recordSuccess(); } } + + public void recordNotApplicableIfUnknown() { + if (isUnknown()) { + status = OperationResultStatus.NOT_APPLICABLE; + } + } /** * Method returns {@link Map} with operation parameters. Parameters keys are diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/lens/ChangeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/lens/ChangeExecutor.java index 115a108ecb9..e7b7d024598 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/lens/ChangeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/lens/ChangeExecutor.java @@ -96,6 +96,9 @@ public class ChangeExecutor { private static final Trace LOGGER = TraceManager.getTrace(ChangeExecutor.class); private static final String OPERATION_EXECUTE_DELTA = ChangeExecutor.class.getName() + ".executeDelta"; + private static final String OPERATION_EXECUTE = ChangeExecutor.class.getName() + ".execute"; + private static final String OPERATION_EXECUTE_FOCUS = OPERATION_EXECUTE + ".focus"; + private static final String OPERATION_EXECUTE_PROJECTION = OPERATION_EXECUTE + ".projection"; private static final String OPERATION_LINK_ACCOUNT = ChangeExecutor.class.getName() + ".linkAccount"; private static final String OPERATION_UNLINK_ACCOUNT = ChangeExecutor.class.getName() + ".unlinkAccount"; @@ -127,142 +130,155 @@ private void locateUserDefinition() { public void executeChanges(LensContext syncContext, Task task, OperationResult parentResult) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, RewindException, ExpressionEvaluationException { - OperationResult result = parentResult.createSubresult(ChangeExecutor.class+".executeChanges"); + OperationResult result = parentResult.createSubresult(OPERATION_EXECUTE); - try { - LensFocusContext focusContext = syncContext.getFocusContext(); - if (focusContext != null) { - ObjectDelta userDelta = focusContext.getWaveDelta(syncContext.getExecutionWave()); - if (userDelta != null) { - - executeDelta(userDelta, focusContext, syncContext, null, task, result); - - if (UserType.class.isAssignableFrom(userDelta.getObjectTypeClass()) && task.getRequesteeOid() == null) { - task.setRequesteeOidImmediate(userDelta.getOid(), result); - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Set requestee OID to " + userDelta.getOid() + "; task = " + task.dump()); - } - } - } else { - LOGGER.trace("Skipping change execute, because user delta is null"); - } - } + LensFocusContext focusContext = syncContext.getFocusContext(); + if (focusContext != null) { + ObjectDelta userDelta = focusContext.getWaveDelta(syncContext.getExecutionWave()); + if (userDelta != null) { - for (LensProjectionContext

accCtx : syncContext.getProjectionContexts()) { - if (accCtx.getWave() != syncContext.getExecutionWave()) { - continue; - } + OperationResult subResult = result.createSubresult(OPERATION_EXECUTE_FOCUS); + try { + + executeDelta(userDelta, focusContext, syncContext, null, task, subResult); + + if (UserType.class.isAssignableFrom(userDelta.getObjectTypeClass()) && task.getRequesteeOid() == null) { + task.setRequesteeOidImmediate(userDelta.getOid(), subResult); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Set requestee OID to " + userDelta.getOid() + "; task = " + task.dump()); + } + } + + subResult.computeStatus(); + + } catch (SchemaException e) { + subResult.recordFatalError(e); + throw e; + } catch (ObjectNotFoundException e) { + subResult.recordFatalError(e); + throw e; + } catch (ObjectAlreadyExistsException e) { + subResult.computeStatus(); + if (!subResult.isSuccess()) { + subResult.recordFatalError(e); + } + throw e; + } catch (CommunicationException e) { + subResult.recordFatalError(e); + throw e; + } catch (ConfigurationException e) { + subResult.recordFatalError(e); + throw e; + } catch (SecurityViolationException e) { + subResult.recordFatalError(e); + throw e; + } catch (RewindException e) { + subResult.recordHandledError(e.getMessage()); + throw e; + } catch (ExpressionEvaluationException e) { + subResult.recordFatalError(e); + throw e; + } catch (RuntimeException e) { + subResult.recordFatalError(e); + throw e; + } + } else { + LOGGER.trace("Skipping focus change execute, because user delta is null"); + } + } + + for (LensProjectionContext

accCtx : syncContext.getProjectionContexts()) { + if (accCtx.getWave() != syncContext.getExecutionWave()) { + continue; + } + OperationResult subResult = result.createSubresult(OPERATION_EXECUTE_PROJECTION); + subResult.addContext("discriminator", accCtx.getResourceShadowDiscriminator()); try { - ObjectDelta

accDelta = accCtx.getExecutableDelta(); - if (accCtx.getSynchronizationPolicyDecision() == SynchronizationPolicyDecision.BROKEN){ - if (syncContext.getFocusContext().getDelta() != null - && syncContext.getFocusContext().getDelta().isDelete() && syncContext.getOptions() != null + ObjectDelta

accDelta = accCtx.getExecutableDelta(); + if (accCtx.getSynchronizationPolicyDecision() == SynchronizationPolicyDecision.BROKEN) { + if (syncContext.getFocusContext().getDelta() != null + && syncContext.getFocusContext().getDelta().isDelete() + && syncContext.getOptions() != null && ModelExecuteOptions.isForce(syncContext.getOptions())) { - if (accDelta == null){ - accDelta = ObjectDelta.createDeleteDelta(accCtx.getObjectTypeClass(), accCtx.getOid(), prismContext); + if (accDelta == null) { + accDelta = ObjectDelta.createDeleteDelta(accCtx.getObjectTypeClass(), + accCtx.getOid(), prismContext); } - } - if (accDelta != null && accDelta.isDelete()){ - - executeDelta(accDelta, accCtx, syncContext, accCtx.getResource(), task, result); + } + if (accDelta != null && accDelta.isDelete()) { + + executeDelta(accDelta, accCtx, syncContext, accCtx.getResource(), task, subResult); - // accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.DELETE); + // accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.DELETE); + } + } else { + if (accDelta == null || accDelta.isEmpty()) { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("No change for account " + + accCtx.getResourceShadowDiscriminator()); + LOGGER.trace("Delta:\n{}", accDelta == null ? null : accDelta.dump()); } - } else { - if (accDelta == null || accDelta.isEmpty()) { - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("No change for account " - + accCtx.getResourceShadowDiscriminator()); - LOGGER.trace("Delta:\n{}", accDelta == null ? null : accDelta.dump()); - } - if (focusContext != null) { - updateAccountLinks(focusContext.getObjectNew(), focusContext, accCtx, task, - result); - } - continue; + if (focusContext != null) { + updateAccountLinks(focusContext.getObjectNew(), focusContext, accCtx, task, + subResult); } + subResult.computeStatus(); + subResult.recordNotApplicableIfUnknown(); + continue; + } - executeDelta(accDelta, accCtx, syncContext, accCtx.getResource(), task, result); + executeDelta(accDelta, accCtx, syncContext, accCtx.getResource(), task, subResult); - } + } - if (focusContext != null) { - updateAccountLinks(focusContext.getObjectNew(), focusContext, accCtx, task, result); - } - - - } catch (SchemaException e) { - result.recordFatalError(e); - accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); - continue; - } catch (ObjectNotFoundException e) { - result.recordFatalError(e); - accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); - continue; - } catch (ObjectAlreadyExistsException e) { - // int his case we do not need to set account context as - // broken, instead we need to restart projector for this - // context to recompute new account or find out if the - // account was already linked.. -// result.computeStatus(); -// if (!result.isSuccess()) { - result.recordFatalError(e); -// } -// accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); - continue; - } catch (CommunicationException e) { - result.recordFatalError(e); - accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); - continue; - } catch (ConfigurationException e) { - result.recordFatalError(e); - accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); - continue; - } catch (SecurityViolationException e) { - result.recordFatalError(e); - accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); - continue; - } catch (ExpressionEvaluationException e) { - result.recordFatalError(e); - accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); - continue; - } catch (RuntimeException e) { - result.recordFatalError(e); - accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); - continue; + if (focusContext != null) { + updateAccountLinks(focusContext.getObjectNew(), focusContext, accCtx, task, subResult); } + + subResult.computeStatus(); + subResult.recordNotApplicableIfUnknown(); + + } catch (SchemaException e) { + subResult.recordFatalError(e); + accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); + continue; + } catch (ObjectNotFoundException e) { + subResult.recordFatalError(e); + accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); + continue; + } catch (ObjectAlreadyExistsException e) { + // in his case we do not need to set account context as + // broken, instead we need to restart projector for this + // context to recompute new account or find out if the + // account was already linked.. + subResult.recordFatalError(e); + continue; + } catch (CommunicationException e) { + subResult.recordFatalError(e); + accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); + continue; + } catch (ConfigurationException e) { + subResult.recordFatalError(e); + accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); + continue; + } catch (SecurityViolationException e) { + subResult.recordFatalError(e); + accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); + continue; + } catch (ExpressionEvaluationException e) { + subResult.recordFatalError(e); + accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); + continue; + } catch (RuntimeException e) { + subResult.recordFatalError(e); + accCtx.setSynchronizationPolicyDecision(SynchronizationPolicyDecision.BROKEN); + continue; } - result.computeStatus(); - - } catch (SchemaException e) { - result.recordFatalError(e); - throw e; - } catch (ObjectNotFoundException e) { - result.recordFatalError(e); - throw e; - } catch (ObjectAlreadyExistsException e) { - result.computeStatus(); - if (!result.isSuccess()) { - result.recordFatalError(e); - } - throw e; - } catch (CommunicationException e) { - result.recordFatalError(e); - throw e; - } catch (ConfigurationException e) { - result.recordFatalError(e); - throw e; - } catch (SecurityViolationException e) { - result.recordFatalError(e); - throw e; - } catch (ExpressionEvaluationException e) { - result.recordFatalError(e); - throw e; - } catch (RuntimeException e) { - result.recordFatalError(e); - throw e; - } + } + // Result computation here needs to be slightly different + result.computeStatusComposite(); + } /** diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/lens/LensProjectionContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/lens/LensProjectionContext.java index cd5333f3e38..04fe0265c57 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/lens/LensProjectionContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/lens/LensProjectionContext.java @@ -551,9 +551,15 @@ public void checkConsistence(String contextDesc, boolean fresh, boolean force) { super.checkConsistence(contextDesc); if (synchronizationPolicyDecision == SynchronizationPolicyDecision.BROKEN) { // OID is all we need for broken context - if (getOid() == null) { - throw new IllegalStateException("No OID in broken context in "+this + (contextDesc == null ? "" : " in " +contextDesc)); - } +// System.out.println("is add delta: " + isAdd()); +// System.out.println("primaty delta: " + getPrimaryDelta().dump()); +// System.out.println("secondary delta: " + getSecondaryDelta().dump()); +// if (isAdd()){ +// return; +// } +// if (getOid() == null) { +// throw new IllegalStateException("No OID in broken context in "+this + (contextDesc == null ? "" : " in " +contextDesc)); +// } return; } if (fresh && !force) { diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestAssignmentErrors.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestAssignmentErrors.java index 00dfdb00441..e2ac49d0f58 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestAssignmentErrors.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestAssignmentErrors.java @@ -107,18 +107,15 @@ public void test100UserJackAssignBlankAccount() throws Exception { ObjectDelta accountAssignmentUserDelta = createAccountAssignmentUserDelta(USER_JACK_OID, RESOURCE_DUMMY_WHITE_OID, null, true); deltas.add(accountAssignmentUserDelta); - try { - // WHEN - modelService.executeChanges(deltas, null, task, result); - - AssertJUnit.fail("Unexpected success of modelService.executeChanges(), expected an exception"); - } catch (SchemaException e) { - // This is expected - display("Expected exception", e); - } + // WHEN + //not expected that it fails, insted the fatal error in the result is excpected + modelService.executeChanges(deltas, null, task, result); result.computeStatus(); - assertFailure(result); + + display(result); + // This has to be a partial error as some changes were executed (user) and others were not (account) + IntegrationTestTools.assertPartialError(result); } @@ -143,15 +140,15 @@ public void test101AddUserCharlesAssignBlankAccount() throws Exception { ObjectDelta userDelta = ObjectDelta.createAddDelta(userCharles); Collection> deltas = MiscSchemaUtil.createCollection(userDelta); - try { +// try { // WHEN modelService.executeChanges(deltas, null, task, result); - - AssertJUnit.fail("Unexpected success of modelService.executeChanges(), expected an exception"); - } catch (SchemaException e) { - // This is expected - display("Expected exception", e); - } + //not expected that it fails, insted the fatal error in the result is excpected +// AssertJUnit.fail("Unexpected success of modelService.executeChanges(), expected an exception"); +// } catch (SchemaException e) { +// // This is expected +// display("Expected exception", e); +// } result.computeStatus(); assertFailure(result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestBrokenCSV.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestBrokenCSV.java index 38c4969942a..84d6aad2bf3 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestBrokenCSV.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/negative/TestBrokenCSV.java @@ -404,7 +404,7 @@ public void test320GetResourceNoJars() throws Exception { * * This one dies on the lack of schema. */ - // Work in progress, MID-1108 + // MID-1248 @Test(enabled=false) public void test400AssignTwoResouresNotFound() throws Exception { testAssignTwoResoures("test400AssignTwoResoures", RESOURCE_CSVFILE_NOTFOUND_OID); @@ -416,8 +416,7 @@ public void test400AssignTwoResouresNotFound() throws Exception { * * This one dies on connector error. */ - // Work in progress, MID-1108 - @Test(enabled=false) + @Test public void test401AssignTwoResouresBroken() throws Exception { testAssignTwoResoures("test401AssignTwoResouresBroken", RESOURCE_CSVFILE_BROKEN_OID); } @@ -426,7 +425,6 @@ public void test401AssignTwoResouresBroken() throws Exception { * 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. */ - // Work in progress, MID-1108 private void testAssignTwoResoures(final String TEST_NAME, String badResourceOid) throws Exception { displayTestTile(this, TEST_NAME); @@ -446,7 +444,7 @@ private void testAssignTwoResoures(final String TEST_NAME, String badResourceOid // THEN result.computeStatus(); display("executeChanges result", result); -// assertEquals("Expected partial errror in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus()); + assertEquals("Expected partial error in result", OperationResultStatus.PARTIAL_ERROR, result.getStatus()); DummyAccount jackDummyAccount = dummyResource.getAccountByUsername(USER_JACK_USERNAME); assertNotNull("No jack dummy account", jackDummyAccount); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ConfigurationExceptionHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ConfigurationExceptionHandler.java index 0e1ec941db1..330a5bb2e89 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ConfigurationExceptionHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/consistency/impl/ConfigurationExceptionHandler.java @@ -75,6 +75,7 @@ public T handleError(T shadow, FailedOperat //this should not happen. But if it happens, we should return original exception } + parentResult.recordFatalError("Configuration error: " + ex.getMessage(), ex); throw new ConfigurationException("Configuration error: "+ex.getMessage(), ex); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/IcfUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/IcfUtil.java index c777c644e90..bb3a463506a 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/IcfUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/IcfUtil.java @@ -195,7 +195,7 @@ static Exception processIcfException(Exception icfException, private static Exception lookForKnownCause(Throwable ex, Throwable originalException, OperationResult parentResult) { if (ex instanceof FileNotFoundException) { - Exception newEx = new ConfigurationException(createMessageFromAllExceptions(null, ex)); + Exception newEx = new com.evolveum.midpoint.util.exception.ConfigurationException(createMessageFromAllExceptions(null, ex)); parentResult.recordFatalError("File not found: "+ex.getMessage(), newEx); return newEx; } else if (ex instanceof NameAlreadyBoundException) { diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java index 5dadc4d59f0..04ffc04cfe0 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/IntegrationTestTools.java @@ -194,10 +194,17 @@ public static void assertSuccess(String message, OperationResult result) { public static void assertFailure(String message, OperationResult result) { assertTrue(message, result.isError()); + assertNoUnknown(result); } public static void assertFailure(OperationResult result) { assertTrue("Expected that operation "+result.getOperation()+" fails, but the result was "+result.getStatus(), result.isError()); + assertNoUnknown(result); + } + + public static void assertPartialError(OperationResult result) { + assertTrue("Expected that operation "+result.getOperation()+" fails partially, but the result was "+result.getStatus(), result.getStatus() == OperationResultStatus.PARTIAL_ERROR); + assertNoUnknown(result); } public static void assertFailure(OperationResultType result) { @@ -209,6 +216,27 @@ public static void assertFailure(String message, OperationResultType result) { "Expected that operation "+result.getOperation()+" fails, but the result was "+result.getStatus(), OperationResultStatusType.FATAL_ERROR == result.getStatus() || OperationResultStatusType.PARTIAL_ERROR == result.getStatus()) ; + assertNoUnknown(result); + } + + public static void assertNoUnknown(OperationResult result) { + // FIXME: temprarily disabled +// if (result.isUnknown()) { +// AssertJUnit.fail("Unkwnown status for operation "+result.getOperation()); +// } +// for (OperationResult subresult: result.getSubresults()) { +// assertNoUnknown(subresult); +// } + } + + public static void assertNoUnknown(OperationResultType result) { + // FIXME: temprarily disabled +// if (result.getStatus() == OperationResultStatusType.UNKNOWN) { +// AssertJUnit.fail("Unkwnown status for operation "+result.getOperation()); +// } +// for (OperationResultType subresult: result.getPartialResults()) { +// assertNoUnknown(subresult); +// } } /**