2020import static org .assertj .core .api .Assertions .assertThatThrownBy ;
2121
2222import com .fasterxml .jackson .databind .JsonNode ;
23- import io .serverlessworkflow .api . types . TryTask ;
23+ import io .serverlessworkflow .impl . TaskContextData ;
2424import io .serverlessworkflow .impl .WorkflowApplication ;
2525import io .serverlessworkflow .impl .WorkflowException ;
2626import io .serverlessworkflow .impl .WorkflowModel ;
2727import io .serverlessworkflow .impl .jackson .JsonUtils ;
2828import io .serverlessworkflow .impl .lifecycle .TaskCompletedEvent ;
29+ import io .serverlessworkflow .impl .lifecycle .TaskEvent ;
2930import io .serverlessworkflow .impl .lifecycle .TaskRetriedEvent ;
30- import io .serverlessworkflow .impl .lifecycle .TraceExecutionListener ;
3131import io .serverlessworkflow .impl .lifecycle .WorkflowExecutionListener ;
3232import java .io .IOException ;
3333import java .time .Duration ;
3434import java .util .Map ;
35- import java .util .Set ;
3635import java .util .concurrent .CompletableFuture ;
3736import java .util .concurrent .ConcurrentHashMap ;
3837import okhttp3 .mockwebserver .MockResponse ;
@@ -55,11 +54,7 @@ void setUp() throws IOException {
5554 apiServer = new MockWebServer ();
5655 apiServer .start (9797 );
5756 retryListener = new RetryListener ();
58- app =
59- WorkflowApplication .builder ()
60- .withListener (retryListener )
61- .withListener (new TraceExecutionListener ())
62- .build ();
57+ app = WorkflowApplication .builder ().withListener (retryListener ).build ();
6358 }
6459
6560 @ AfterEach
@@ -71,16 +66,21 @@ void tearDown() throws IOException {
7166 private class RetryListener implements WorkflowExecutionListener {
7267
7368 private Map <String , Short > taskRetried = new ConcurrentHashMap <>();
74- private Set < Short > contexts = ConcurrentHashMap . newKeySet ();
69+ private Map < String , Short > taskCompleted = new ConcurrentHashMap <> ();
7570
71+ @ Override
7672 public void onTaskRetried (TaskRetriedEvent ev ) {
77- taskRetried . put ( ev . taskContext (). position (). jsonPointer () , ev . taskContext (). retryAttempt () );
73+ add2Map ( taskRetried , ev );
7874 }
7975
76+ @ Override
8077 public void onTaskCompleted (TaskCompletedEvent ev ) {
81- if (ev .taskContext ().task () instanceof TryTask ) {
82- contexts .add (ev .taskContext ().retryAttempt ());
83- }
78+ add2Map (taskCompleted , ev );
79+ }
80+
81+ private static void add2Map (Map <String , Short > map , TaskEvent ev ) {
82+ TaskContextData taskContext = ev .taskContext ();
83+ map .put (taskContext .position ().jsonPointer (), taskContext .retryAttempt ());
8484 }
8585 }
8686
@@ -107,8 +107,7 @@ void testRetry(String path) throws IOException {
107107 .atMost (Duration .ofSeconds (1 ))
108108 .until (() -> future .join ().as (JsonNode .class ).orElseThrow ().equals (result ));
109109 assertThat (retryListener .taskRetried ).hasSize (1 );
110- assertThat (retryListener .taskRetried .get ("do/0/tryGetPet/do/0/getPet" )).isEqualTo ((short ) 2 );
111- assertThat (retryListener .contexts ).containsOnly ((short ) 0 );
110+ assertThat (retryListener .taskRetried .get ("do/0/tryGetPet/try/0/getPet" )).isEqualTo ((short ) 2 );
112111 }
113112
114113 @ Test
@@ -135,8 +134,37 @@ void testNestedRetry() throws IOException {
135134 .atMost (Duration .ofSeconds (1 ))
136135 .until (() -> future .join ().as (JsonNode .class ).orElseThrow ().equals (result ));
137136 assertThat (retryListener .taskRetried ).hasSize (2 );
138- assertThat (retryListener .taskRetried .values ()).containsExactlyInAnyOrder ((short ) 5 , (short ) 2 );
139- assertThat (retryListener .contexts ).containsExactlyInAnyOrder ((short ) 0 , (short ) 2 );
137+ assertThat (retryListener .taskRetried .get ("do/0/tryServerError/try/0/tryCommunication/try" ))
138+ .isEqualTo ((short ) 2 );
139+ assertThat (
140+ retryListener .taskRetried .get (
141+ "do/0/tryServerError/try/0/tryCommunication/try/0/getPet" ))
142+ .isEqualTo ((short ) 5 );
143+ assertThat (retryListener .taskCompleted .get ("do/0/tryServerError/try/0/tryCommunication/try" ))
144+ .isEqualTo ((short ) 2 );
145+ assertThat (retryListener .taskCompleted .get ("do/0/tryServerError/try" )).isEqualTo ((short ) 0 );
146+ }
147+
148+ @ Test
149+ void testRetryDo () throws IOException {
150+ CompletableFuture <WorkflowModel > future =
151+ app .workflowDefinition (
152+ readWorkflowFromClasspath ("workflows-samples/try-catch-with-do.yaml" ))
153+ .instance (Map .of ("delay" , 0.01 ))
154+ .start ();
155+ Awaitility .await ()
156+ .atMost (Duration .ofSeconds (1 ))
157+ .until (
158+ () ->
159+ future
160+ .join ()
161+ .asMap ()
162+ .orElseThrow ()
163+ .equals (Map .of ("setAfterFailingTask" , "No problem" )));
164+
165+ assertThat (retryListener .taskCompleted .get ("do/0/attemptTask/try" )).isEqualTo ((short ) 0 );
166+ assertThat (retryListener .taskCompleted )
167+ .containsKey ("do/0/attemptTask/catch/do/0/executeAfterFailingTask" );
140168 }
141169
142170 @ Test
0 commit comments