@@ -255,8 +255,114 @@ public async void Commit_Should_Be_Executed()
255255rollBackFunc . Verify ( x=> x . Invoke ( It . IsAny < BranchBarrier > ( ) ) , Times . Never ) ;
256256commitFunc . Verify ( x=> x . Invoke ( It . IsAny < BranchBarrier > ( ) ) , Times . Once ) ;
257257}
258+
259+ [ Fact ]
260+ public async Task Execute_Result_Should_Be_WfFunc2 ( )
261+ {
262+ var factory = new Mock < IWorkflowFactory > ( ) ;
263+ var httpClient = new Mock < IDtmClient > ( ) ;
264+ var grpcClient = new Mock < IDtmgRPCClient > ( ) ;
265+ var httpBb = new Mock < Dtmcli . IBranchBarrierFactory > ( ) ;
266+
267+ SetupPrepareWorkflow ( httpClient , DtmCommon . Constant . StatusPrepared , null ) ;
268+ var wf = SetupWorkFlow ( httpClient , grpcClient , httpBb ) ;
269+
270+ factory . Setup ( x=> x . NewWorkflow ( It . IsAny < string > ( ) , It . IsAny < string > ( ) , It . IsAny < byte [ ] > ( ) , It . IsAny < bool > ( ) ) ) . Returns ( wf . Object ) ;
271+
272+ var wfgt = new WorkflowGlobalTransaction ( factory . Object , NullLoggerFactory . Instance ) ;
273+
274+ var wfName = nameof ( Execute_Result_Should_Be_WfFunc2 ) ;
275+ var gid = Guid . NewGuid ( ) . ToString ( "N" ) ;
276+
277+ wfgt . Register ( wfName , ( workflow , data ) => Task . FromResult ( Encoding . UTF8 . GetBytes ( "return value from WfFunc2" ) ) ) ;
278+
279+ var req = JsonSerializer . Serialize ( new { userId = "1" , amount = 30 } ) ;
280+ var res = await wfgt . Execute ( wfName , gid , Encoding . UTF8 . GetBytes ( req ) , true ) ;
281+
282+ Assert . Equal ( "return value from WfFunc2" , Encoding . UTF8 . GetString ( res ) ) ;
283+ }
284+
285+ [ Fact ]
286+ public async Task Execute_Result_Should_Be_Previous ( )
287+ {
288+ var factory = new Mock < IWorkflowFactory > ( ) ;
289+ var httpClient = new Mock < IDtmClient > ( ) ;
290+ var grpcClient = new Mock < IDtmgRPCClient > ( ) ;
291+ var httpBb = new Mock < Dtmcli . IBranchBarrierFactory > ( ) ;
292+
293+ SetupPrepareWorkflow ( httpClient , DtmCommon . Constant . StatusSucceed , "return value from previous" ) ;
294+ var wf = SetupWorkFlow ( httpClient , grpcClient , httpBb ) ;
295+
296+ factory . Setup ( x=> x . NewWorkflow ( It . IsAny < string > ( ) , It . IsAny < string > ( ) , It . IsAny < byte [ ] > ( ) , It . IsAny < bool > ( ) ) ) . Returns ( wf . Object ) ;
297+
298+ var wfgt = new WorkflowGlobalTransaction ( factory . Object , NullLoggerFactory . Instance ) ;
299+
300+ var wfName = nameof ( Execute_Result_Should_Be_Previous ) ;
301+ var gid = Guid . NewGuid ( ) . ToString ( "N" ) ;
302+
303+ wfgt . Register ( wfName , ( workflow , data ) => Task . FromResult ( Encoding . UTF8 . GetBytes ( "return value from WfFunc2" ) ) ) ;
304+
305+ var req = JsonSerializer . Serialize ( new { userId = "1" , amount = 30 } ) ;
306+ var res = await wfgt . Execute ( wfName , gid , Encoding . UTF8 . GetBytes ( req ) , true ) ;
307+
308+ Assert . Equal ( "return value from previous" , Encoding . UTF8 . GetString ( res ) ) ;
309+ }
310+
311+ [ Fact ]
312+ public async Task Execute_Again_Result_Should_Be_Previous ( )
313+ {
314+ var factory = new Mock < IWorkflowFactory > ( ) ;
315+ var httpClient1 = new Mock < IDtmClient > ( ) ;
316+ var httpClient2 = new Mock < IDtmClient > ( ) ;
317+ var grpcClient = new Mock < IDtmgRPCClient > ( ) ;
318+ var httpBb = new Mock < Dtmcli . IBranchBarrierFactory > ( ) ;
319+
320+ // first
321+ SetupPrepareWorkflow ( httpClient1 , DtmCommon . Constant . StatusPrepared , null ) ;
322+ var wf = SetupWorkFlow ( httpClient1 , grpcClient , httpBb ) ;
323+ factory . Setup ( x=> x . NewWorkflow ( It . IsAny < string > ( ) , It . IsAny < string > ( ) , It . IsAny < byte [ ] > ( ) , It . IsAny < bool > ( ) ) ) . Returns ( wf . Object ) ;
324+ var wfgt = new WorkflowGlobalTransaction ( factory . Object , NullLoggerFactory . Instance ) ;
325+ var wfName = nameof ( Execute_Again_Result_Should_Be_Previous ) ;
326+ var gid = Guid . NewGuid ( ) . ToString ( "N" ) ;
327+ wfgt . Register ( wfName , ( workflow , data ) => Task . FromResult ( Encoding . UTF8 . GetBytes ( "return value from WfFunc2" ) ) ) ;
328+ var req = JsonSerializer . Serialize ( new { userId = "1" , amount = 30 } ) ;
329+ var res = await wfgt . Execute ( wfName , gid , Encoding . UTF8 . GetBytes ( req ) , true ) ;
330+ Assert . Equal ( "return value from WfFunc2" , Encoding . UTF8 . GetString ( res ) ) ;
331+
332+ // again
333+ SetupPrepareWorkflow ( httpClient2 , DtmCommon . Constant . StatusSucceed , "return value from previous" ) ;
334+ wf = SetupWorkFlow ( httpClient2 , grpcClient , httpBb ) ;
335+ factory . Setup ( x=> x . NewWorkflow ( It . IsAny < string > ( ) , It . IsAny < string > ( ) , It . IsAny < byte [ ] > ( ) , It . IsAny < bool > ( ) ) ) . Returns ( wf . Object ) ;
336+ wfgt = new WorkflowGlobalTransaction ( factory . Object , NullLoggerFactory . Instance ) ;
337+ gid = Guid . NewGuid ( ) . ToString ( "N" ) ;
338+ wfgt . Register ( wfName , ( workflow , data ) => Task . FromResult ( Encoding . UTF8 . GetBytes ( "return value from WfFunc2" ) ) ) ;
339+ req = JsonSerializer . Serialize ( new { userId = "1" , amount = 30 } ) ;
340+ res = await wfgt . Execute ( wfName , gid , Encoding . UTF8 . GetBytes ( req ) , true ) ;
341+ Assert . Equal ( "return value from previous" , Encoding . UTF8 . GetString ( res ) ) ;
342+ }
343+
344+ [ Fact ]
345+ public async Task Execute_Again_Result_StringEmpty ( )
346+ {
347+ var factory = new Mock < IWorkflowFactory > ( ) ;
348+ var httpClient = new Mock < IDtmClient > ( ) ;
349+ var grpcClient = new Mock < IDtmgRPCClient > ( ) ;
350+ var httpBb = new Mock < Dtmcli . IBranchBarrierFactory > ( ) ;
351+
352+ // again
353+ SetupPrepareWorkflow ( httpClient , DtmCommon . Constant . StatusSucceed , null ) ;
354+ var wf = SetupWorkFlow ( httpClient , grpcClient , httpBb ) ;
355+ factory . Setup ( x=> x . NewWorkflow ( It . IsAny < string > ( ) , It . IsAny < string > ( ) , It . IsAny < byte [ ] > ( ) , It . IsAny < bool > ( ) ) ) . Returns ( wf . Object ) ;
356+ var wfgt = new WorkflowGlobalTransaction ( factory . Object , NullLoggerFactory . Instance ) ;
357+ var wfName = nameof ( Execute_Again_Result_StringEmpty ) ;
358+ var gid = Guid . NewGuid ( ) . ToString ( "N" ) ;
359+ wfgt . Register ( wfName , ( workflow , data ) => Task . FromResult ( Encoding . UTF8 . GetBytes ( "return value from WfFunc2" ) ) ) ;
360+ var req = JsonSerializer . Serialize ( new { userId = "1" , amount = 30 } ) ;
361+ var res = await wfgt . Execute ( wfName , gid , Encoding . UTF8 . GetBytes ( req ) , true ) ;
362+ Assert . Null ( res ) ;
363+ }
258364
259- private void SetupPrepareWorkflow ( Mock < IDtmClient > httpClient , string status , string result , List < DtmProgressDto > progressDtos = null )
365+ private void SetupPrepareWorkflow ( Mock < IDtmClient > httpClient , string status , string ? result , List < DtmProgressDto > progressDtos = null )
260366{
261367var httpResp = new HttpResponseMessage ( HttpStatusCode . OK ) ;
262368httpResp . Content = new StringContent ( JsonSerializer . Serialize (
@@ -265,9 +371,9 @@ private void SetupPrepareWorkflow(Mock<IDtmClient> httpClient, string status, st
265371Transaction = new DtmTransactionDto
266372{
267373Status = status ,
268- Result = Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( result ) )
374+ Result = result == null ? null : Convert . ToBase64String ( Encoding . UTF8 . GetBytes ( result ) )
269375} ,
270- Progresses = progressDtos
376+ Progresses = progressDtos ?? [ ]
271377} ) ) ;
272378httpClient . Setup ( x=> x . PrepareWorkflow ( It . IsAny < DtmCommon . TransBase > ( ) , It . IsAny < CancellationToken > ( ) ) ) . Returns ( Task . FromResult ( httpResp ) ) ;
273379}