test cover more
This commit is contained in:
parent
28b8f91969
commit
a920fbadc3
@ -26,7 +26,7 @@ func TccGlobalTransaction(dtm string, tccFunc TccGlobalFunc) (gid string, rerr e
|
|||||||
"trans_type": "tcc",
|
"trans_type": "tcc",
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if x := recover(); x != nil {
|
if x := recover(); x != nil || rerr != nil {
|
||||||
_, rerr = common.RestyClient.R().SetBody(data).Post(dtm + "/abort")
|
_, rerr = common.RestyClient.R().SetBody(data).Post(dtm + "/abort")
|
||||||
} else {
|
} else {
|
||||||
_, rerr = common.RestyClient.R().SetBody(data).Post(dtm + "/submit")
|
_, rerr = common.RestyClient.R().SetBody(data).Post(dtm + "/submit")
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package dtmsvr
|
|||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -42,7 +43,9 @@ func TestDtmSvr(t *testing.T) {
|
|||||||
examples.ResetXaData()
|
examples.ResetXaData()
|
||||||
|
|
||||||
tccBarrierNormal(t)
|
tccBarrierNormal(t)
|
||||||
|
tccBarrierRollback(t)
|
||||||
sagaBarrierNormal(t)
|
sagaBarrierNormal(t)
|
||||||
|
sagaBarrierRollback(t)
|
||||||
msgNormal(t)
|
msgNormal(t)
|
||||||
msgPending(t)
|
msgPending(t)
|
||||||
tccNormal(t)
|
tccNormal(t)
|
||||||
@ -139,12 +142,12 @@ func tccNormal(t *testing.T) {
|
|||||||
}
|
}
|
||||||
func tccBarrierNormal(t *testing.T) {
|
func tccBarrierNormal(t *testing.T) {
|
||||||
_, err := dtmcli.TccGlobalTransaction(DtmServer, func(tcc *dtmcli.Tcc) (rerr error) {
|
_, 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)
|
e2p(rerr)
|
||||||
if res1.StatusCode() != 200 {
|
if res1.StatusCode() != 200 {
|
||||||
return fmt.Errorf("bad status code: %d", res1.StatusCode())
|
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)
|
e2p(rerr)
|
||||||
if res2.StatusCode() != 200 {
|
if res2.StatusCode() != 200 {
|
||||||
return fmt.Errorf("bad status code: %d", res2.StatusCode())
|
return fmt.Errorf("bad status code: %d", res2.StatusCode())
|
||||||
@ -155,6 +158,29 @@ func tccBarrierNormal(t *testing.T) {
|
|||||||
e2p(err)
|
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) {
|
func tccRollback(t *testing.T) {
|
||||||
data := &examples.TransReq{Amount: 30, TransInResult: "FAIL"}
|
data := &examples.TransReq{Amount: 30, TransInResult: "FAIL"}
|
||||||
_, err := dtmcli.TccGlobalTransaction(examples.DtmServer, func(tcc *dtmcli.Tcc) (rerr error) {
|
_, 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))
|
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) {
|
func sagaCommittedPending(t *testing.T) {
|
||||||
saga := genSaga("gid-committedPending", false, false)
|
saga := genSaga("gid-committedPending", false, false)
|
||||||
examples.MainSwitch.TransInResult.SetOnce("PENDING")
|
examples.MainSwitch.TransInResult.SetOnce("PENDING")
|
||||||
|
|||||||
@ -40,8 +40,12 @@ func sagaBarrierAdjustBalance(sdb *sql.DB, uid int, amount int) (interface{}, er
|
|||||||
}
|
}
|
||||||
|
|
||||||
func sagaBarrierTransIn(c *gin.Context) (interface{}, error) {
|
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 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) {
|
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 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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -14,14 +14,14 @@ import (
|
|||||||
func TccBarrierFireRequest() string {
|
func TccBarrierFireRequest() string {
|
||||||
logrus.Printf("tcc transaction begin")
|
logrus.Printf("tcc transaction begin")
|
||||||
gid, err := dtmcli.TccGlobalTransaction(DtmServer, func(tcc *dtmcli.Tcc) (rerr error) {
|
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 {
|
if rerr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if res1.StatusCode() != 200 {
|
if res1.StatusCode() != 200 {
|
||||||
return fmt.Errorf("bad status code: %d", res1.StatusCode())
|
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 {
|
if rerr != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -75,8 +75,12 @@ func adjustBalance(sdb *sql.DB, uid int, amount int) (interface{}, error) {
|
|||||||
|
|
||||||
// TCC下,转入
|
// TCC下,转入
|
||||||
func tccBarrierTransInTry(c *gin.Context) (interface{}, error) {
|
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 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) {
|
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 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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user