@@ -419,6 +419,8 @@ void subOrchestrationWithFailedActivity() throws TimeoutException {
419419 final String childOrchestratorName = "ChildOrchestration" ;
420420 final String activityName = "FailingActivity" ;
421421 final String failureMessage = "Simulated activity failure in sub-orchestration" ;
422+ final String expectedOutput = "Success after rewind" ;
423+ final AtomicBoolean shouldFail = new AtomicBoolean (true );
422424
423425 DurableTaskGrpcWorker worker = this .createWorkerBuilder ()
424426 .addOrchestrator (parentOrchestratorName , ctx -> {
@@ -430,20 +432,34 @@ void subOrchestrationWithFailedActivity() throws TimeoutException {
430432 ctx .complete (result );
431433 })
432434 .addActivity (activityName , ctx -> {
433- throw new RuntimeException (failureMessage );
435+ if (shouldFail .compareAndSet (true , false )) {
436+ throw new RuntimeException (failureMessage );
437+ }
438+ return expectedOutput ;
434439 })
435440 .buildAndStart ();
436441
437442 DurableTaskClient client = this .createClientBuilder ().build ();
438443 try (worker ; client ) {
439444 String instanceId = client .scheduleNewOrchestrationInstance (parentOrchestratorName );
445+
446+ // Wait for the orchestration to fail due to the activity failure in the sub-orchestration
440447 OrchestrationMetadata instance = client .waitForInstanceCompletion (instanceId , defaultTimeout , true );
441448 assertNotNull (instance );
442449 assertEquals (OrchestrationRuntimeStatus .FAILED , instance .getRuntimeStatus ());
443450
444451 FailureDetails details = instance .getFailureDetails ();
445452 assertNotNull (details );
446453 assertTrue (details .getErrorMessage ().contains (failureMessage ));
454+
455+ // Rewind the failed orchestration
456+ client .rewindInstance (instanceId , "Rewinding sub-orchestration with failed activity" );
457+
458+ // Wait for the orchestration to complete after rewind
459+ instance = client .waitForInstanceCompletion (instanceId , defaultTimeout , true );
460+ assertNotNull (instance );
461+ assertEquals (OrchestrationRuntimeStatus .COMPLETED , instance .getRuntimeStatus ());
462+ assertEquals (expectedOutput , instance .readOutputAs (String .class ));
447463 }
448464 }
449465
0 commit comments