1616package io .serverlessworkflow .impl ;
1717
1818import static org .assertj .core .api .Assertions .assertThat ;
19+ import static org .assertj .core .api .Assertions .catchThrowableOfType ;
1920
2021import io .cloudevents .CloudEvent ;
2122import io .cloudevents .core .data .PojoCloudEventData ;
2223import io .serverlessworkflow .api .WorkflowReader ;
24+ import io .serverlessworkflow .impl .events .EventRegistration ;
2325import io .serverlessworkflow .impl .events .EventRegistrationBuilder ;
2426import io .serverlessworkflow .impl .lifecycle .ce .TaskCompletedCEData ;
2527import io .serverlessworkflow .impl .lifecycle .ce .TaskStartedCEData ;
3234import java .util .Collection ;
3335import java .util .Map ;
3436import java .util .Optional ;
35- import org .junit .jupiter .api .AfterAll ;
37+ import java .util .concurrent .CompletableFuture ;
38+ import java .util .concurrent .ExecutionException ;
39+ import java .util .concurrent .TimeUnit ;
40+ import java .util .concurrent .TimeoutException ;
3641import org .junit .jupiter .api .AfterEach ;
37- import org .junit .jupiter .api .BeforeAll ;
3842import org .junit .jupiter .api .BeforeEach ;
3943import org .junit .jupiter .api .Test ;
4044
4145class LifeCycleEventsTest {
4246
43- private static WorkflowApplication appl ;
44- private static Collection <CloudEvent > publishedEvents ;
45-
46- @ BeforeAll
47- static void init () {
48- appl = WorkflowApplication .builder ().build ();
49- appl .eventConsumer ()
50- .listenToAll (appl )
51- .forEach (
52- v ->
53- appl .eventConsumer ()
54- .register (
55- (EventRegistrationBuilder ) v , ce -> publishedEvents .add ((CloudEvent ) ce )));
56- }
57-
58- @ AfterAll
59- static void cleanup () {
60- appl .close ();
61- }
47+ private WorkflowApplication appl ;
48+ private Collection <CloudEvent > publishedEvents ;
49+ private Collection <EventRegistration > registrations ;
6250
6351 @ BeforeEach
6452 void setup () {
6553 publishedEvents = new ArrayList <>();
54+ appl = WorkflowApplication .builder ().build ();
55+ registrations = new ArrayList <>();
56+ Collection <EventRegistrationBuilder > builders = appl .eventConsumer ().listenToAll (appl );
57+
58+ for (EventRegistrationBuilder builder : builders ) {
59+ registrations .add (
60+ appl .eventConsumer ().register (builder , ce -> publishedEvents .add ((CloudEvent ) ce )));
61+ }
6662 }
6763
6864 @ AfterEach
6965 void close () {
70- publishedEvents = new ArrayList <>( );
66+ registrations . forEach ( r -> appl . eventConsumer (). unregister ( r ) );
7167 }
7268
7369 @ Test
@@ -77,23 +73,48 @@ void simpleWorkflow() throws IOException {
7773 .instance (Map .of ())
7874 .start ()
7975 .join ();
76+ WorkflowStartedCEData workflowStartedEvent =
77+ assertPojoInCE ("io.serverlessworkflow.workflow.started.v1" , WorkflowStartedCEData .class );
78+ TaskStartedCEData taskStartedEvent =
79+ assertPojoInCE ("io.serverlessworkflow.task.started.v1" , TaskStartedCEData .class );
80+ TaskCompletedCEData taskCompletedEvent =
81+ assertPojoInCE ("io.serverlessworkflow.task.completed.v1" , TaskCompletedCEData .class );
8082 WorkflowCompletedCEData workflowCompletedEvent =
8183 assertPojoInCE (
8284 "io.serverlessworkflow.workflow.completed.v1" , WorkflowCompletedCEData .class );
8385 assertThat (workflowCompletedEvent .output ()).isEqualTo (model .asJavaObject ());
84- WorkflowStartedCEData workflowStartedEvent =
85- assertPojoInCE ("io.serverlessworkflow.workflow.started.v1" , WorkflowStartedCEData .class );
8686 assertThat (workflowStartedEvent .startedAt ()).isBefore (workflowCompletedEvent .completedAt ());
87- TaskCompletedCEData taskCompletedEvent =
88- assertPojoInCE ("io.serverlessworkflow.task.completed.v1" , TaskCompletedCEData .class );
8987 assertThat (taskCompletedEvent .output ()).isEqualTo (model .asJavaObject ());
9088 assertThat (taskCompletedEvent .completedAt ()).isBefore (workflowCompletedEvent .completedAt ());
91- TaskStartedCEData taskStartedEvent =
92- assertPojoInCE ("io.serverlessworkflow.task.started.v1" , TaskStartedCEData .class );
9389 assertThat (taskStartedEvent .startedAt ()).isAfter (workflowStartedEvent .startedAt ());
9490 assertThat (taskStartedEvent .startedAt ()).isBefore (taskCompletedEvent .completedAt ());
9591 }
9692
93+ @ Test
94+ void suspendResume () throws IOException , ExecutionException , InterruptedException {
95+ WorkflowInstance instance =
96+ appl .workflowDefinition (WorkflowReader .readWorkflowFromClasspath ("wait-set.yaml" ))
97+ .instance (Map .of ());
98+ CompletableFuture <WorkflowModel > future = instance .start ();
99+ instance .suspend ();
100+ assertThat (instance .status ()).isEqualTo (WorkflowStatus .SUSPENDED );
101+ instance .resume ();
102+ assertThat (future .get ().asMap ().orElseThrow ()).isEqualTo (Map .of ("name" , "Javierito" ));
103+ }
104+
105+ @ Test
106+ void suspendResumeTimeout ()
107+ throws IOException , ExecutionException , InterruptedException , TimeoutException {
108+ WorkflowInstance instance =
109+ appl .workflowDefinition (WorkflowReader .readWorkflowFromClasspath ("wait-set.yaml" ))
110+ .instance (Map .of ());
111+ CompletableFuture <WorkflowModel > future = instance .start ();
112+ instance .suspend ();
113+ assertThat (instance .status ()).isEqualTo (WorkflowStatus .SUSPENDED );
114+ catchThrowableOfType (
115+ TimeoutException .class , () -> future .get (500 , TimeUnit .MILLISECONDS ).asMap ());
116+ }
117+
97118 @ Test
98119 void testError () throws IOException {
99120 appl .workflowDefinition (WorkflowReader .readWorkflowFromClasspath ("raise-inline.yaml" ))
0 commit comments