From a920fbadc3c7a1d192b1e29f87afe7e02d72db27 Mon Sep 17 00:00:00 2001 From: yedongfu Date: Fri, 16 Jul 2021 18:17:45 +0800 Subject: [PATCH] test cover more --- dtmcli/tcc.go | 2 +- dtmsvr/dtmsvr_test.go | 41 +++++++++++++++++++++++++++++++++-- examples/main_saga_barrier.go | 12 ++++++++-- examples/main_tcc_barrier.go | 16 ++++++++++---- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/dtmcli/tcc.go b/dtmcli/tcc.go index 04386ec..e6fe79e 100644 --- a/dtmcli/tcc.go +++ b/dtmcli/tcc.go @@ -26,7 +26,7 @@ func TccGlobalTransaction(dtm string, tccFunc TccGlobalFunc) (gid string, rerr e "trans_type": "tcc", } defer func() { - if x := recover(); x != nil { + if x := recover(); x != nil || rerr != nil { _, rerr = common.RestyClient.R().SetBody(data).Post(dtm + "/abort") } else { _, rerr = common.RestyClient.R().SetBody(data).Post(dtm + "/submit") diff --git a/dtmsvr/dtmsvr_test.go b/dtmsvr/dtmsvr_test.go index 28debeb..e9728be 100644 --- a/dtmsvr/dtmsvr_test.go +++ b/dtmsvr/dtmsvr_test.go @@ -3,6 +3,7 @@ package dtmsvr import ( "database/sql" "fmt" + "strings" "testing" "time" @@ -42,7 +43,9 @@ func TestDtmSvr(t *testing.T) { examples.ResetXaData() tccBarrierNormal(t) + tccBarrierRollback(t) sagaBarrierNormal(t) + sagaBarrierRollback(t) msgNormal(t) msgPending(t) tccNormal(t) @@ -139,12 +142,12 @@ func tccNormal(t *testing.T) { } func tccBarrierNormal(t *testing.T) { _, err := dtmcli.TccGlobalTransaction(DtmServer, func(tcc *dtmcli.Tcc) (rerr error) { - res1, rerr := tcc.CallBranch(&examples.TransReq{Amount: 30}, Busi+"/TccBTransOutTry", Busi+"/TccBTransOutConfirm", Busi+"/TccBTransOutRevert") + res1, rerr := tcc.CallBranch(&examples.TransReq{Amount: 30}, Busi+"/TccBTransOutTry", Busi+"/TccBTransOutConfirm", Busi+"/TccBTransOutCancel") e2p(rerr) if res1.StatusCode() != 200 { return fmt.Errorf("bad status code: %d", res1.StatusCode()) } - res2, rerr := tcc.CallBranch(&examples.TransReq{Amount: 30}, Busi+"/TccBTransInTry", Busi+"/TccBTransInConfirm", Busi+"/TccBTransInRevert") + res2, rerr := tcc.CallBranch(&examples.TransReq{Amount: 30}, Busi+"/TccBTransInTry", Busi+"/TccBTransInConfirm", Busi+"/TccBTransInCancel") e2p(rerr) if res2.StatusCode() != 200 { return fmt.Errorf("bad status code: %d", res2.StatusCode()) @@ -155,6 +158,29 @@ func tccBarrierNormal(t *testing.T) { e2p(err) } +func tccBarrierRollback(t *testing.T) { + gid, err := dtmcli.TccGlobalTransaction(DtmServer, func(tcc *dtmcli.Tcc) (rerr error) { + res1, rerr := tcc.CallBranch(&examples.TransReq{Amount: 30}, Busi+"/TccBTransOutTry", Busi+"/TccBTransOutConfirm", Busi+"/TccBTransOutCancel") + e2p(rerr) + if res1.StatusCode() != 200 { + return fmt.Errorf("bad status code: %d", res1.StatusCode()) + } + res2, rerr := tcc.CallBranch(&examples.TransReq{Amount: 30, TransInResult: "FAIL"}, Busi+"/TccBTransInTry", Busi+"/TccBTransInConfirm", Busi+"/TccBTransInCancel") + e2p(rerr) + if res2.StatusCode() != 200 { + return fmt.Errorf("bad status code: %d", res2.StatusCode()) + } + if strings.Contains(res2.String(), "FAIL") { + return fmt.Errorf("branch trans in fail") + } + logrus.Printf("tcc returns: %s, %s", res1.String(), res2.String()) + return + }) + e2p(err) + WaitTransProcessed(gid) + assert.Equal(t, "failed", getTransStatus(gid)) +} + func tccRollback(t *testing.T) { data := &examples.TransReq{Amount: 30, TransInResult: "FAIL"} _, err := dtmcli.TccGlobalTransaction(examples.DtmServer, func(tcc *dtmcli.Tcc) (rerr error) { @@ -219,6 +245,17 @@ func sagaRollback(t *testing.T) { assert.Equal(t, []string{"succeed", "succeed", "succeed", "failed"}, getBranchesStatus(saga.Gid)) } +func sagaBarrierRollback(t *testing.T) { + saga := dtmcli.NewSaga(DtmServer). + Add(Busi+"/SagaBTransOut", Busi+"/SagaBTransOutCompensate", &examples.TransReq{Amount: 30}). + Add(Busi+"/SagaBTransIn", Busi+"/SagaBTransInCompensate", &examples.TransReq{Amount: 30, TransInResult: "FAIL"}) + logrus.Printf("busi trans submit") + err := saga.Submit() + e2p(err) + WaitTransProcessed(saga.Gid) + assert.Equal(t, "failed", getTransStatus(saga.Gid)) +} + func sagaCommittedPending(t *testing.T) { saga := genSaga("gid-committedPending", false, false) examples.MainSwitch.TransInResult.SetOnce("PENDING") diff --git a/examples/main_saga_barrier.go b/examples/main_saga_barrier.go index 3683eb0..54d452d 100644 --- a/examples/main_saga_barrier.go +++ b/examples/main_saga_barrier.go @@ -40,8 +40,12 @@ func sagaBarrierAdjustBalance(sdb *sql.DB, uid int, amount int) (interface{}, er } func sagaBarrierTransIn(c *gin.Context) (interface{}, error) { + req := reqFrom(c) + if req.TransInResult != "" { + return req.TransInResult, nil + } return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { - return sagaBarrierAdjustBalance(sdb, 1, reqFrom(c).Amount) + return sagaBarrierAdjustBalance(sdb, 1, req.Amount) }) } @@ -52,8 +56,12 @@ func sagaBarrierTransInCompensate(c *gin.Context) (interface{}, error) { } func sagaBarrierTransOut(c *gin.Context) (interface{}, error) { + req := reqFrom(c) + if req.TransInResult != "" { + return req.TransInResult, nil + } return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { - return sagaBarrierAdjustBalance(sdb, 2, -reqFrom(c).Amount) + return sagaBarrierAdjustBalance(sdb, 2, -req.Amount) }) } diff --git a/examples/main_tcc_barrier.go b/examples/main_tcc_barrier.go index e68f268..4c03c43 100644 --- a/examples/main_tcc_barrier.go +++ b/examples/main_tcc_barrier.go @@ -14,14 +14,14 @@ import ( func TccBarrierFireRequest() string { logrus.Printf("tcc transaction begin") gid, err := dtmcli.TccGlobalTransaction(DtmServer, func(tcc *dtmcli.Tcc) (rerr error) { - res1, rerr := tcc.CallBranch(&TransReq{Amount: 30}, Busi+"/TccBTransOutTry", Busi+"/TccBTransOutConfirm", Busi+"/TccBTransOutRevert") + res1, rerr := tcc.CallBranch(&TransReq{Amount: 30}, Busi+"/TccBTransOutTry", Busi+"/TccBTransOutConfirm", Busi+"/TccBTransOutCancel") if rerr != nil { return } if res1.StatusCode() != 200 { return fmt.Errorf("bad status code: %d", res1.StatusCode()) } - res2, rerr := tcc.CallBranch(&TransReq{Amount: 30}, Busi+"/TccBTransInTry", Busi+"/TccBTransInConfirm", Busi+"/TccBTransInRevert") + res2, rerr := tcc.CallBranch(&TransReq{Amount: 30}, Busi+"/TccBTransInTry", Busi+"/TccBTransInConfirm", Busi+"/TccBTransInCancel") if rerr != nil { return } @@ -75,8 +75,12 @@ func adjustBalance(sdb *sql.DB, uid int, amount int) (interface{}, error) { // TCC下,转入 func tccBarrierTransInTry(c *gin.Context) (interface{}, error) { + req := reqFrom(c) + if req.TransInResult != "" { + return req.TransInResult, nil + } return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { - return adjustTrading(sdb, transInUID, reqFrom(c).Amount) + return adjustTrading(sdb, transInUID, req.Amount) }) } @@ -93,8 +97,12 @@ func tccBarrierTransInCancel(c *gin.Context) (interface{}, error) { } func tccBarrierTransOutTry(c *gin.Context) (interface{}, error) { + req := reqFrom(c) + if req.TransInResult != "" { + return req.TransInResult, nil + } return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.TransInfoFromReq(c), func(sdb *sql.DB) (interface{}, error) { - return adjustTrading(sdb, transOutUID, -reqFrom(c).Amount) + return adjustTrading(sdb, transOutUID, -req.Amount) }) }