88import io .temporal .testing .internal .SDKTestWorkflowRule ;
99import io .temporal .workflow .unsafe .WorkflowUnsafe ;
1010import java .util .Arrays ;
11+ import java .util .Collections ;
1112import java .util .List ;
1213import java .util .concurrent .CopyOnWriteArrayList ;
1314import org .junit .Rule ;
@@ -18,10 +19,13 @@ public class EvictionIsReplayingTest {
1819
1920 @ Rule
2021 public SDKTestWorkflowRule testWorkflowRule =
21- SDKTestWorkflowRule .newBuilder ().setWorkflowTypes (TestWorkflowImpl .class ).build ();
22+ SDKTestWorkflowRule .newBuilder ()
23+ .setWorkflowTypes (TestWorkflowImpl .class , BlockedHandlerWorkflowImpl .class )
24+ .build ();
2225
2326 @ Test
2427 public void evictionUnwindsWorkflowCodeAsReplay () {
28+ replayingInFinally .clear ();
2529 TestWorkflow workflow = testWorkflowRule .newWorkflowStub (TestWorkflow .class );
2630 WorkflowExecution execution = WorkflowClient .start (workflow ::execute );
2731 testWorkflowRule .waitForTheEndOfWFT (execution .getWorkflowId ());
@@ -34,6 +38,19 @@ public void evictionUnwindsWorkflowCodeAsReplay() {
3438 assertEquals (Arrays .asList (true , false ), replayingInFinally );
3539 }
3640
41+ @ Test
42+ public void completionUnwindsBlockedHandlersLive () {
43+ replayingInFinally .clear ();
44+ BlockedHandlerWorkflow workflow =
45+ testWorkflowRule .newWorkflowStub (BlockedHandlerWorkflow .class );
46+ WorkflowClient .start (workflow ::execute );
47+
48+ workflow .block ();
49+ WorkflowStub .fromTyped (workflow ).getResult (Void .class );
50+
51+ assertEquals (Collections .singletonList (false ), replayingInFinally );
52+ }
53+
3754 @ WorkflowInterface
3855 public interface TestWorkflow {
3956 @ WorkflowMethod
@@ -60,4 +77,32 @@ public void finish() {
6077 finished = true ;
6178 }
6279 }
80+
81+ @ WorkflowInterface
82+ public interface BlockedHandlerWorkflow {
83+ @ WorkflowMethod
84+ void execute ();
85+
86+ @ SignalMethod
87+ void block ();
88+ }
89+
90+ public static class BlockedHandlerWorkflowImpl implements BlockedHandlerWorkflow {
91+ private boolean blocked ;
92+
93+ @ Override
94+ public void execute () {
95+ Workflow .await (() -> blocked );
96+ }
97+
98+ @ Override
99+ public void block () {
100+ blocked = true ;
101+ try {
102+ Workflow .await (() -> false );
103+ } finally {
104+ replayingInFinally .add (WorkflowUnsafe .isReplaying ());
105+ }
106+ }
107+ }
63108}
0 commit comments