4343import static org .awaitility .Awaitility .await ;
4444import static org .eclipse .dataplane .domain .dataflow .DataFlow .State .COMPLETED ;
4545import static org .eclipse .dataplane .domain .dataflow .DataFlow .State .PREPARED ;
46+ import static org .eclipse .dataplane .domain .dataflow .DataFlow .State .PREPARING ;
4647import static org .eclipse .dataplane .domain .dataflow .DataFlow .State .STARTED ;
4748import static org .eclipse .dataplane .domain .dataflow .DataFlow .State .TERMINATED ;
4849
@@ -72,7 +73,7 @@ void shouldPushDataToEndpointPreparedByConsumer() {
7273 var transferType = "FileSystem-PUSH" ;
7374 var processId = UUID .randomUUID ().toString ();
7475 var consumerProcessId = "consumer_" + processId ;
75- var prepareMessage = createPrepareMessage (consumerProcessId , transferType );
76+ var prepareMessage = createPrepareMessage (consumerProcessId , controlPlane . consumerCallbackAddress (), transferType );
7677
7778 var prepareResponse = controlPlane .consumerPrepare (prepareMessage ).statusCode (200 ).extract ().as (DataFlowResponseMessage .class );
7879 assertThat (prepareResponse .state ()).isEqualTo (PREPARED .name ());
@@ -103,7 +104,7 @@ void shouldSendError_whenFlowFails() {
103104 var transferType = "FileSystem-PUSH" ;
104105 var processId = UUID .randomUUID ().toString ();
105106 var consumerProcessId = "consumer_" + processId ;
106- var prepareMessage = createPrepareMessage (consumerProcessId , transferType );
107+ var prepareMessage = createPrepareMessage (consumerProcessId , controlPlane . consumerCallbackAddress (), transferType );
107108
108109 controlPlane .consumerPrepare (prepareMessage ).statusCode (200 ).extract ().as (DataFlowResponseMessage .class );
109110 var invalidDataAddress = new DataAddress ("FileSystem" , "" , emptyList ());
@@ -121,15 +122,32 @@ void shouldSendError_whenFlowFails() {
121122 });
122123 }
123124
125+ @ Test
126+ void shouldPermitAsyncPreparation () {
127+ var transferType = "FileSystemAsync-PUSH" ;
128+ var processId = UUID .randomUUID ().toString ();
129+ var consumerProcessId = "consumer_" + processId ;
130+ var prepareMessage = createPrepareMessage (consumerProcessId , controlPlane .consumerCallbackAddress (), transferType );
131+
132+ var prepareResponse = controlPlane .consumerPrepare (prepareMessage ).statusCode (202 ).extract ().as (DataFlowResponseMessage .class );
133+ assertThat (prepareResponse .state ()).isEqualTo (PREPARING .name ());
134+ assertThat (prepareResponse .dataAddress ()).isNull ();
135+
136+ consumerDataPlane .completePreparation (consumerProcessId );
137+
138+ assertThat (controlPlane .consumerStatus (consumerProcessId ).statusCode (200 ).extract ().as (DataFlowStatusResponseMessage .class ).state ())
139+ .isEqualTo (PREPARED .name ());
140+ }
141+
124142 private @ NonNull DataFlowStartMessage createStartMessage (String providerProcessId , String callbackAddress , String transferType , DataAddress destinationDataAddress ) {
125143 return new DataFlowStartMessage ("theMessageId" , "theParticipantId" , "theCounterPartyId" ,
126144 "theDataspaceContext" , providerProcessId , "theAgreementId" , "theDatasetId" , callbackAddress ,
127145 transferType , destinationDataAddress , emptyList (), emptyMap ());
128146 }
129147
130- private @ NonNull DataFlowPrepareMessage createPrepareMessage (String consumerProcessId , String transferType ) {
148+ private @ NonNull DataFlowPrepareMessage createPrepareMessage (String consumerProcessId , String callbackAddress , String transferType ) {
131149 return new DataFlowPrepareMessage ("theMessageId" , "theParticipantId" , "theCounterPartyId" ,
132- "theDataspaceContext" , consumerProcessId , "theAgreementId" , "theDatasetId" , "theCallbackAddress" ,
150+ "theDataspaceContext" , consumerProcessId , "theAgreementId" , "theDatasetId" , callbackAddress ,
133151 transferType , emptyList (), emptyMap ());
134152 }
135153
@@ -178,13 +196,24 @@ private static class ConsumerDataPlane {
178196 .onTerminate (Result ::success )
179197 .build ();
180198
199+ public void completePreparation (String dataFlowId ) {
200+ sdk .getById (dataFlowId )
201+ .compose (dataFlow -> sdk .notifyPrepared (dataFlowId , this ::prepareDestinationDataAddress ))
202+ .orElseThrow (f -> new RuntimeException (f .getCause ()));
203+ }
204+
181205 private Result <DataFlow > onPrepare (DataFlow dataFlow ) {
182- try {
183- var destinationFile = Files .createTempDirectory ("consumer-dest" ).resolve (dataFlow .getId () + "-content" );
184- var dataAddress = new DataAddress ("FileSystem" , "file" , destinationFile .toString (), emptyList ());
206+ if (dataFlow .getTransferType ().equals ("FileSystemAsync-PUSH" )) {
207+ dataFlow .transitionToPreparing ();
208+ return Result .success (dataFlow );
209+ }
185210
186- dataFlow .setDataAddress (dataAddress );
211+ return prepareDestinationDataAddress (dataFlow );
212+ }
187213
214+ private @ NonNull Result <DataFlow > prepareDestinationDataAddress (DataFlow dataFlow ) {
215+ try {
216+ dataFlow .setDataAddress (destinationDataAddress (dataFlow ));
188217 return Result .success (dataFlow );
189218 } catch (IOException e ) {
190219 return Result .failure (e );
@@ -205,6 +234,11 @@ private Result<DataFlow> onCompleted(DataFlow dataFlow) {
205234 }
206235 }
207236
237+ private @ NonNull DataAddress destinationDataAddress (DataFlow dataFlow ) throws IOException {
238+ var destinationFile = Files .createTempDirectory ("consumer-dest" ).resolve (dataFlow .getId () + "-content" );
239+ return new DataAddress ("file" , destinationFile .toString (), emptyList ());
240+ }
241+
208242 public Object controller () {
209243 return sdk .controller ();
210244 }
0 commit comments