diff --git a/dtmsvr/trans_tcc.go b/dtmsvr/trans_tcc.go index 8870fa3..8baac06 100644 --- a/dtmsvr/trans_tcc.go +++ b/dtmsvr/trans_tcc.go @@ -28,6 +28,7 @@ func (t *transTccProcessor) ProcessOnce(db *common.DB, branches []TransBranch) e branchType := dtmimp.If(t.Status == dtmcli.StatusSubmitted, dtmcli.BranchConfirm, dtmcli.BranchCancel).(string) for current := len(branches) - 1; current >= 0; current-- { if branches[current].BranchType == branchType && branches[current].Status == dtmcli.StatusPrepared { + dtmimp.Logf("branch info: current: %d ID: %d", current, branches[current].ID) err := t.execBranch(db, &branches[current]) if err != nil { return err diff --git a/test/tcc_grpc_test.go b/test/tcc_grpc_test.go index ca117d0..cf5c312 100644 --- a/test/tcc_grpc_test.go +++ b/test/tcc_grpc_test.go @@ -12,53 +12,59 @@ import ( "google.golang.org/protobuf/types/known/emptypb" ) -func TestTccGrpcType(t *testing.T) { - _, err := dtmgrpc.TccFromGrpc(context.Background()) - assert.Error(t, err) - dtmimp.Logf("expecting dtmgrpcserver error") - err = dtmgrpc.TccGlobalTransaction("-", "", func(tcc *dtmgrpc.TccGrpc) error { return nil }) - assert.Error(t, err) -} func TestTccGrpcNormal(t *testing.T) { - data := &examples.BusiReq{Amount: 30} + req := examples.GenBusiReq(30, false, false) gid := dtmimp.GetFuncName() err := dtmgrpc.TccGlobalTransaction(examples.DtmGrpcServer, gid, func(tcc *dtmgrpc.TccGrpc) error { r := &emptypb.Empty{} - err := tcc.CallBranch(data, examples.BusiGrpc+"/examples.Busi/TransOut", examples.BusiGrpc+"/examples.Busi/TransOutConfirm", examples.BusiGrpc+"/examples.Busi/TransOutRevert", r) + err := tcc.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransOut", examples.BusiGrpc+"/examples.Busi/TransOutConfirm", examples.BusiGrpc+"/examples.Busi/TransOutRevert", r) assert.Nil(t, err) - err = tcc.CallBranch(data, examples.BusiGrpc+"/examples.Busi/TransIn", examples.BusiGrpc+"/examples.Busi/TransInConfirm", examples.BusiGrpc+"/examples.Busi/TransInRevert", r) - return err + return tcc.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransIn", examples.BusiGrpc+"/examples.Busi/TransInConfirm", examples.BusiGrpc+"/examples.Busi/TransInRevert", r) }) assert.Nil(t, err) -} + waitTransProcessed(gid) + assert.Equal(t, StatusSucceed, getTransStatus(gid)) + assert.Equal(t, []string{StatusPrepared, StatusSucceed, StatusPrepared, StatusPrepared, StatusSucceed, StatusPrepared}, getBranchesStatus(gid)) -func TestGrpcTestNested(t *testing.T) { - data := &examples.BusiReq{Amount: 30} - gid := dtmimp.GetFuncName() - err := dtmgrpc.TccGlobalTransaction(examples.DtmGrpcServer, gid, func(tcc *dtmgrpc.TccGrpc) error { - r := &emptypb.Empty{} - err := tcc.CallBranch(data, examples.BusiGrpc+"/examples.Busi/TransOutTcc", examples.BusiGrpc+"/examples.Busi/TransOutConfirm", examples.BusiGrpc+"/examples.Busi/TransOutRevert", r) - assert.Nil(t, err) - err = tcc.CallBranch(data, examples.BusiGrpc+"/examples.Busi/TransInTccNested", examples.BusiGrpc+"/examples.Busi/TransInConfirm", examples.BusiGrpc+"/examples.Busi/TransInRevert", r) - return err - }) - assert.Nil(t, err) } func TestTccGrpcRollback(t *testing.T) { gid := dtmimp.GetFuncName() - data := &examples.BusiReq{Amount: 30, TransInResult: dtmcli.ResultFailure} + req := examples.GenBusiReq(30, false, true) err := dtmgrpc.TccGlobalTransaction(examples.DtmGrpcServer, gid, func(tcc *dtmgrpc.TccGrpc) error { r := &emptypb.Empty{} - err := tcc.CallBranch(data, examples.BusiGrpc+"/examples.Busi/TransOutTcc", examples.BusiGrpc+"/examples.Busi/TransOutConfirm", examples.BusiGrpc+"/examples.Busi/TransOutRevert", r) + err := tcc.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransOutTcc", examples.BusiGrpc+"/examples.Busi/TransOutConfirm", examples.BusiGrpc+"/examples.Busi/TransOutRevert", r) assert.Nil(t, err) examples.MainSwitch.TransOutRevertResult.SetOnce(dtmcli.ResultOngoing) - err = tcc.CallBranch(data, examples.BusiGrpc+"/examples.Busi/TransInTcc", examples.BusiGrpc+"/examples.Busi/TransInConfirm", examples.BusiGrpc+"/examples.Busi/TransInRevert", r) - return err + return tcc.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransInTcc", examples.BusiGrpc+"/examples.Busi/TransInConfirm", examples.BusiGrpc+"/examples.Busi/TransInRevert", r) }) assert.Error(t, err) waitTransProcessed(gid) assert.Equal(t, StatusAborting, getTransStatus(gid)) cronTransOnce() assert.Equal(t, StatusFailed, getTransStatus(gid)) + assert.Equal(t, []string{StatusSucceed, StatusPrepared, StatusPrepared, StatusSucceed, StatusPrepared, StatusPrepared}, getBranchesStatus(gid)) +} + +func TestTccGrpcNested(t *testing.T) { + req := examples.GenBusiReq(30, false, false) + gid := dtmimp.GetFuncName() + err := dtmgrpc.TccGlobalTransaction(examples.DtmGrpcServer, gid, func(tcc *dtmgrpc.TccGrpc) error { + r := &emptypb.Empty{} + err := tcc.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransOutTcc", examples.BusiGrpc+"/examples.Busi/TransOutConfirm", examples.BusiGrpc+"/examples.Busi/TransOutRevert", r) + assert.Nil(t, err) + return tcc.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransInTccNested", examples.BusiGrpc+"/examples.Busi/TransInConfirm", examples.BusiGrpc+"/examples.Busi/TransInRevert", r) + }) + assert.Nil(t, err) + waitTransProcessed(gid) + assert.Equal(t, StatusSucceed, getTransStatus(gid)) + assert.Equal(t, []string{StatusPrepared, StatusSucceed, StatusPrepared, StatusPrepared, StatusSucceed, StatusPrepared, StatusPrepared, StatusSucceed, StatusPrepared}, getBranchesStatus(gid)) +} + +func TestTccGrpcType(t *testing.T) { + _, err := dtmgrpc.TccFromGrpc(context.Background()) + assert.Error(t, err) + dtmimp.Logf("expecting dtmgrpcserver error") + err = dtmgrpc.TccGlobalTransaction("-", "", func(tcc *dtmgrpc.TccGrpc) error { return nil }) + assert.Error(t, err) } diff --git a/test/xa_grpc_test.go b/test/xa_grpc_test.go index 9534e60..0573658 100644 --- a/test/xa_grpc_test.go +++ b/test/xa_grpc_test.go @@ -6,67 +6,66 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/yedf/dtm/dtmcli" "github.com/yedf/dtm/dtmcli/dtmimp" "github.com/yedf/dtm/dtmgrpc" "github.com/yedf/dtm/examples" "google.golang.org/protobuf/types/known/emptypb" ) -func TestXaGrpcType(t *testing.T) { - _, err := dtmgrpc.XaGrpcFromRequest(context.Background()) - assert.Error(t, err) - - err = examples.XaGrpcClient.XaLocalTransaction(context.Background(), nil, nil) - assert.Error(t, err) - - err = dtmimp.CatchP(func() { - examples.XaGrpcClient.XaGlobalTransaction("id1", func(xa *dtmgrpc.XaGrpc) error { panic(fmt.Errorf("hello")) }) - }) - assert.Error(t, err) +func getXcg() *dtmgrpc.XaGrpcClient { + return examples.XaGrpcClient } - -func TestXaGrpcLocalError(t *testing.T) { - xc := examples.XaGrpcClient - err := xc.XaGlobalTransaction(dtmimp.GetFuncName(), func(xa *dtmgrpc.XaGrpc) error { - return fmt.Errorf("an error") - }) - assert.Error(t, err, fmt.Errorf("an error")) -} - func TestXaGrpcNormal(t *testing.T) { - xc := examples.XaGrpcClient gid := dtmimp.GetFuncName() - err := xc.XaGlobalTransaction(gid, func(xa *dtmgrpc.XaGrpc) error { - req := &examples.BusiReq{Amount: 30} + err := getXcg().XaGlobalTransaction(gid, func(xa *dtmgrpc.XaGrpc) error { + req := examples.GenBusiReq(30, false, false) r := &emptypb.Empty{} err := xa.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransOutXa", r) if err != nil { return err } - err = xa.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransInXa", r) - return err + return xa.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransInXa", r) }) assert.Equal(t, nil, err) waitTransProcessed(gid) + assert.Equal(t, StatusSucceed, getTransStatus(gid)) assert.Equal(t, []string{StatusPrepared, StatusSucceed, StatusPrepared, StatusSucceed}, getBranchesStatus(gid)) } func TestXaGrpcRollback(t *testing.T) { - xc := examples.XaGrpcClient gid := dtmimp.GetFuncName() - err := xc.XaGlobalTransaction(gid, func(xa *dtmgrpc.XaGrpc) error { - req := &examples.BusiReq{Amount: 30, TransInResult: dtmcli.ResultFailure} + err := getXcg().XaGlobalTransaction(gid, func(xa *dtmgrpc.XaGrpc) error { + req := examples.GenBusiReq(30, false, true) r := &emptypb.Empty{} err := xa.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransOutXa", r) if err != nil { return err } - err = xa.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransInXa", r) - return err + return xa.CallBranch(req, examples.BusiGrpc+"/examples.Busi/TransInXa", r) }) assert.Error(t, err) waitTransProcessed(gid) assert.Equal(t, []string{StatusSucceed, StatusPrepared}, getBranchesStatus(gid)) assert.Equal(t, StatusFailed, getTransStatus(gid)) } + +func TestXaGrpcType(t *testing.T) { + _, err := dtmgrpc.XaGrpcFromRequest(context.Background()) + assert.Error(t, err) + + err = examples.XaGrpcClient.XaLocalTransaction(context.Background(), nil, nil) + assert.Error(t, err) + + err = dtmimp.CatchP(func() { + examples.XaGrpcClient.XaGlobalTransaction("id1", func(xa *dtmgrpc.XaGrpc) error { panic(fmt.Errorf("hello")) }) + }) + assert.Error(t, err) +} + +func TestXaGrpcLocalError(t *testing.T) { + xc := examples.XaGrpcClient + err := xc.XaGlobalTransaction(dtmimp.GetFuncName(), func(xa *dtmgrpc.XaGrpc) error { + return fmt.Errorf("an error") + }) + assert.Error(t, err, fmt.Errorf("an error")) +}