2222import org .eclipse .dataplane .domain .DataAddress ;
2323import org .eclipse .dataplane .domain .Result ;
2424import org .eclipse .dataplane .domain .dataflow .DataFlow ;
25+ import org .eclipse .dataplane .domain .dataflow .DataFlowResumeMessage ;
2526import org .eclipse .dataplane .domain .dataflow .DataFlowStatusMessage ;
27+ import org .eclipse .dataplane .domain .dataflow .DataFlowSuspendMessage ;
2628import org .eclipse .dataplane .domain .registration .ControlPlaneRegistrationMessage ;
2729import org .junit .jupiter .api .AfterEach ;
2830import org .junit .jupiter .api .BeforeEach ;
@@ -95,6 +97,47 @@ void shouldPushDataToEndpointPreparedByConsumer() {
9597 consumerDataPlane .assertDataIsFlowing (consumerProcessId );
9698 }
9799
100+ @ Test
101+ void shouldSuspendAndResumeByConsumer () {
102+ var transferType = "FileSystemStreaming-PUSH" ;
103+ var processId = UUID .randomUUID ().toString ();
104+ var consumerProcessId = "consumer_" + processId ;
105+ var prepareMessage = MessageFactory .createPrepareMessage (consumerProcessId , URI .create ("http://callback" ), transferType );
106+
107+ var prepareResponse = controlPlane .consumerPrepare (prepareMessage ).statusCode (200 ).extract ().as (DataFlowStatusMessage .class );
108+ assertThat (prepareResponse .state ()).isEqualTo (PREPARED .name ());
109+ assertThat (prepareResponse .dataAddress ()).isNotNull ();
110+ var destinationDataAddress = prepareResponse .dataAddress ();
111+
112+ var providerProcessId = "provider_" + processId ;
113+ var startMessage = MessageFactory .createStartMessage (providerProcessId , controlPlane .providerCallbackAddress (), transferType , destinationDataAddress );
114+ var startResponse = controlPlane .providerStart (startMessage ).statusCode (200 ).extract ().as (DataFlowStatusMessage .class );
115+
116+ assertThat (startResponse .state ()).isEqualTo (STARTED .name ());
117+ consumerDataPlane .assertDataIsFlowing (consumerProcessId );
118+
119+ controlPlane .consumerSuspend (consumerProcessId , new DataFlowSuspendMessage ("a reason" ))
120+ .statusCode (200 );
121+
122+ controlPlane .providerSuspend (providerProcessId , new DataFlowSuspendMessage ("a reason" ))
123+ .statusCode (200 );
124+
125+ consumerDataPlane .assertNoMoreDataIsTransferred (consumerProcessId );
126+
127+ var resumeMessage = new DataFlowResumeMessage ("theMessageId" , consumerProcessId , null );
128+ var consumerResumeResult = controlPlane .consumerResume (consumerProcessId , resumeMessage )
129+ .statusCode (200 ).extract ().as (DataFlowStatusMessage .class );
130+ assertThat (consumerResumeResult .state ()).isEqualTo ("STARTED" );
131+ assertThat (consumerResumeResult .dataAddress ()).isNotNull ();
132+
133+ var providerResumeResult = controlPlane .providerResume (providerProcessId , new DataFlowResumeMessage ("theMessageId" , providerProcessId , null ))
134+ .statusCode (200 ).extract ().as (DataFlowStatusMessage .class );
135+ assertThat (providerResumeResult .state ()).isEqualTo ("STARTED" );
136+ assertThat (providerResumeResult .dataAddress ()).isNull ();
137+
138+ consumerDataPlane .assertDataIsFlowing (consumerProcessId );
139+ }
140+
98141 private static class ProviderDataPlane {
99142
100143 private final ScheduledExecutorService executor = Executors .newScheduledThreadPool (5 );
@@ -104,6 +147,7 @@ private static class ProviderDataPlane {
104147 .registerAuthorization (new TestAuthorization ())
105148 .onStart (this ::onStart )
106149 .onSuspend (this ::stopFlow )
150+ .onResume (this ::onStart )
107151 .build ();
108152
109153 ProviderDataPlane () {
@@ -147,6 +191,7 @@ private static class ConsumerDataPlane {
147191 .registerAuthorization (new TestAuthorization ())
148192 .onPrepare (this ::onPrepare )
149193 .onSuspend (Result ::success )
194+ .onResume (Result ::success )
150195 .onCompleted (this ::onCompleted )
151196 .build ();
152197
@@ -205,5 +250,18 @@ public void assertDataIsFlowing(String consumerProcessId) {
205250
206251 }
207252
253+ public void assertNoMoreDataIsTransferred (String consumerProcessId ) {
254+ var destinationDataAddress = sdk .getById (consumerProcessId ).map (DataFlow ::getDataAddress )
255+ .orElseThrow (f -> new AssertionError ("No DataFlow with id %s found" .formatted (consumerProcessId )));
256+
257+ var folder = Path .of (destinationDataAddress .endpoint ()).toFile ();
258+
259+ await ().untilAsserted (() -> {
260+ var filesTransferred = Objects .requireNonNull (folder .listFiles ()).length ;
261+ Thread .sleep (1000L );
262+ assertThat (folder .listFiles ()).hasSize (filesTransferred );
263+ });
264+ }
265+
208266 }
209267}
0 commit comments