Browse Source

test for tcc xa reviewed

pull/52/head
yedf2 4 years ago
parent
commit
9249cf2ccf
  1. 1
      dtmsvr/trans_tcc.go
  2. 60
      test/tcc_grpc_test.go
  3. 61
      test/xa_grpc_test.go

1
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

60
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)
}

61
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"))
}

Loading…
Cancel
Save