1+ using Microsoft . Extensions . DependencyInjection ;
2+ using System ;
3+ using System . Text ;
4+ using System . Threading ;
5+ using System . Threading . Tasks ;
6+ using busi ;
7+ using Dtmworkflow ;
8+ using Grpc . Net . Client ;
9+ using Microsoft . Extensions . Logging ;
10+ using Newtonsoft . Json ;
11+ using Xunit ;
12+
13+ namespace Dtmgrpc . IntegrationTests
14+ {
15+ public class WorkflowGrpcTest
16+ {
17+ [ Fact ]
18+ public async Task Execute_Http_Should_Succeed ( )
19+ {
20+ var provider = ITTestHelper . AddDtmGrpc ( ) ;
21+ var workflowFactory = provider . GetRequiredService < IWorkflowFactory > ( ) ;
22+ var loggerFactory = provider . GetRequiredService < ILoggerFactory > ( ) ;
23+ WorkflowGlobalTransaction workflowGlobalTransaction = new WorkflowGlobalTransaction ( workflowFactory , loggerFactory ) ;
24+
25+ string wfName1 = $ "wf-simple-{ Guid . NewGuid ( ) . ToString ( "D" ) [ ..8 ] } ";
26+ workflowGlobalTransaction . Register ( wfName1 , async ( workflow , data ) => await Task . FromResult ( "my result"u8 . ToArray ( ) ) ) ;
27+
28+ string gid = wfName1 + Guid . NewGuid ( ) . ToString ( ) [ ..8 ] ;
29+ var req = ITTestHelper . GenBusiReq ( false , false ) ;
30+ await workflowGlobalTransaction . Execute ( wfName1 , gid , Encoding . UTF8 . GetBytes ( JsonConvert . SerializeObject ( req ) ) , isHttp : true ) ;
31+
32+ string status = await ITTestHelper . GetTranStatus ( gid ) ;
33+ Assert . Equal ( "succeed" , status ) ;
34+ }
35+
36+ [ Fact ]
37+ public async Task Execute_gPRC_Should_Succeed ( )
38+ {
39+ var provider = ITTestHelper . AddDtmGrpc ( ) ;
40+ var workflowFactory = provider . GetRequiredService < IWorkflowFactory > ( ) ;
41+ var loggerFactory = provider . GetRequiredService < ILoggerFactory > ( ) ;
42+ WorkflowGlobalTransaction workflowGlobalTransaction = new WorkflowGlobalTransaction ( workflowFactory , loggerFactory ) ;
43+
44+ string wfName1 = $ "wf-simple-{ Guid . NewGuid ( ) . ToString ( "D" ) [ ..8 ] } ";
45+ workflowGlobalTransaction . Register ( wfName1 , async ( workflow , data ) => await Task . FromResult ( "my result"u8 . ToArray ( ) ) ) ;
46+
47+ string gid = wfName1 + Guid . NewGuid ( ) . ToString ( ) [ ..8 ] ;
48+ var req = ITTestHelper . GenBusiReq ( false , false ) ;
49+ await workflowGlobalTransaction . Execute ( wfName1 , gid , Encoding . UTF8 . GetBytes ( JsonConvert . SerializeObject ( req ) ) , isHttp : false ) ;
50+
51+ string status = await ITTestHelper . GetTranStatus ( gid ) ;
52+ Assert . Equal ( "succeed" , status ) ;
53+ }
54+
55+ [ Fact ]
56+ public async Task Execute_Success ( )
57+ {
58+ var provider = ITTestHelper . AddDtmGrpc ( ) ;
59+ var workflowFactory = provider . GetRequiredService < IWorkflowFactory > ( ) ;
60+ var loggerFactory = provider . GetRequiredService < ILoggerFactory > ( ) ;
61+ WorkflowGlobalTransaction workflowGlobalTransaction = new WorkflowGlobalTransaction ( workflowFactory , loggerFactory ) ;
62+
63+ Busi . BusiClient busiClient = new Busi . BusiClient ( GrpcChannel . ForAddress ( ITTestHelper . BuisgRPCUrlWithProtocol ) ) ;
64+
65+ string wfName1 = $ "wf-simple-{ Guid . NewGuid ( ) . ToString ( "D" ) [ ..8 ] } ";
66+ workflowGlobalTransaction . Register ( wfName1 , async ( workflow , data ) =>
67+ {
68+ BusiReq request = JsonConvert . DeserializeObject < BusiReq > ( Encoding . UTF8 . GetString ( data ) ) ;
69+ workflow . NewBranch ( ) . OnRollback ( async ( barrier ) =>
70+ {
71+ await busiClient . TransInRevertAsync ( request ) ;
72+ } ) ;
73+ await busiClient . TransInAsync ( request ) ;
74+
75+ workflow . NewBranch ( ) . OnRollback ( async ( barrier ) =>
76+ {
77+ await busiClient . TransOutRevertAsync ( request ) ;
78+ } ) ;
79+ await busiClient . TransOutAsync ( request ) ;
80+
81+ return await Task . FromResult ( "my result"u8 . ToArray ( ) ) ;
82+ } ) ;
83+
84+ string gid = wfName1 + Guid . NewGuid ( ) . ToString ( ) [ ..8 ] ;
85+ var req = ITTestHelper . GenBusiReq ( false , false ) ;
86+ byte [ ] result = await workflowGlobalTransaction . Execute ( wfName1 , gid , Encoding . UTF8 . GetBytes ( JsonConvert . SerializeObject ( req ) ) ) ;
87+ Assert . Equal ( "my result" , Encoding . UTF8 . GetString ( result ) ) ;
88+ string status = await ITTestHelper . GetTranStatus ( gid ) ;
89+ Assert . Equal ( "succeed" , status ) ;
90+
91+ // again
92+ result = await workflowGlobalTransaction . Execute ( wfName1 , gid , Encoding . UTF8 . GetBytes ( JsonConvert . SerializeObject ( req ) ) ) ;
93+ Assert . Equal ( "my result" , Encoding . UTF8 . GetString ( result ) ) ;
94+ status = await ITTestHelper . GetTranStatus ( gid ) ;
95+ Assert . Equal ( "succeed" , status ) ;
96+ }
97+ }
98+ }