blob: c9197092be784a118ab8074bb418f1f7b9f6352f [file] [log] [blame]
package lock
import (
"github.com/stretchr/testify/assert"
"github.com/dk-lockdown/seata-golang/common"
"github.com/dk-lockdown/seata-golang/logging"
"github.com/dk-lockdown/seata-golang/meta"
"github.com/dk-lockdown/seata-golang/tc/session"
"github.com/dk-lockdown/seata-golang/util"
"sync"
"testing"
)
func TestLockManager_AcquireLock(t *testing.T) {
bs := branchSessionProvider()
ok,err := GetLockManager().AcquireLock(bs)
assert.Equal(t,ok,true)
assert.Equal(t,err,nil)
}
func TestLockManager_IsLockable(t *testing.T) {
transId := util.GeneratorUUID()
ok := GetLockManager().IsLockable(common.XID.GenerateXID(transId),"tb_1","tb_1:13")
assert.Equal(t,ok,true)
}
func TestLockManager_AcquireLock_Fail(t *testing.T) {
sessions := branchSessionsProvider()
result1,err1 := GetLockManager().AcquireLock(sessions[0])
result2,err2 := GetLockManager().AcquireLock(sessions[1])
assert.True(t,result1)
assert.Equal(t,err1,nil)
assert.False(t,result2)
assert.Equal(t,err2,nil)
}
func TestLockManager_AcquireLock_DeadLock(t *testing.T) {
sessions := deadlockBranchSessionsProvider()
defer func() {
GetLockManager().ReleaseLock(sessions[0])
GetLockManager().ReleaseLock(sessions[1])
}()
wg := sync.WaitGroup{}
wg.Add(2)
go func(session *session.BranchSession) {
defer wg.Done()
result, err := GetLockManager().AcquireLock(session)
logging.Logger.Infof("1: %v %v",result,err)
}(sessions[0])
go func(session *session.BranchSession) {
defer wg.Done()
result, err := GetLockManager().AcquireLock(session)
logging.Logger.Infof("2: %v %v",result,err)
}(sessions[1])
wg.Wait()
assert.True(t,true)
}
func TestLockManager_IsLockable2(t *testing.T) {
bs := branchSessionProvider()
bs.SetLockKey("t:4")
result1 := GetLockManager().IsLockable(bs.Xid,bs.ResourceId,bs.LockKey)
assert.True(t,result1)
GetLockManager().AcquireLock(bs)
bs.SetTransactionId(util.GeneratorUUID())
result2 := GetLockManager().IsLockable(bs.Xid,bs.ResourceId,bs.LockKey)
assert.False(t,result2)
}
func TestLockManager_AcquireLock_SessionHolder(t *testing.T) {
sessions := duplicatePkBranchSessionsProvider()
result1, _ := GetLockManager().AcquireLock(sessions[0])
assert.True(t,result1)
assert.Equal(t,int64(4),GetLockManager().GetLockKeyCount())
result2, _ := GetLockManager().ReleaseLock(sessions[0])
assert.True(t,result2)
assert.Equal(t,int64(0),GetLockManager().GetLockKeyCount())
result3, _ := GetLockManager().AcquireLock(sessions[1])
assert.True(t,result3)
assert.Equal(t,int64(4),GetLockManager().GetLockKeyCount())
result4, _ := GetLockManager().ReleaseLock(sessions[1])
assert.True(t,result4)
assert.Equal(t,int64(0),GetLockManager().GetLockKeyCount())
}
func deadlockBranchSessionsProvider() []*session.BranchSession {
return baseBranchSessionsProvider("tb_2", "t:1,2,3,4,5", "t:5,4,3,2,1")
}
func duplicatePkBranchSessionsProvider() []*session.BranchSession {
return baseBranchSessionsProvider("tb_2", "t:1,2;t1:1;t2:2", "t:1,2;t1:1;t2:2")
}
func branchSessionsProvider() []*session.BranchSession {
return baseBranchSessionsProvider("tb_1", "t:1,2", "t:1,2")
}
func baseBranchSessionsProvider(resourceId string, lockKey1 string, lockKey2 string) []*session.BranchSession {
var branchSessions = make([]*session.BranchSession,0)
transId := util.GeneratorUUID()
transId2 := util.GeneratorUUID()
bs := session.NewBranchSession().
SetXid(common.XID.GenerateXID(transId)).
SetTransactionId(transId).
SetBranchId(1).
SetResourceGroupId("my_test_tx_group").
SetResourceId(resourceId).
SetLockKey(lockKey1).
SetBranchType(meta.BranchTypeAT).
SetStatus(meta.BranchStatusUnknown).
SetClientId("c1").
SetApplicationData([]byte("{\"data\":\"test\"}"))
bs1 := session.NewBranchSession().
SetXid(common.XID.GenerateXID(transId2)).
SetTransactionId(transId2).
SetBranchId(1).
SetResourceGroupId("my_test_tx_group").
SetResourceId(resourceId).
SetLockKey(lockKey2).
SetBranchType(meta.BranchTypeAT).
SetStatus(meta.BranchStatusUnknown).
SetClientId("c1").
SetApplicationData([]byte("{\"data\":\"test\"}"))
branchSessions = append(branchSessions,bs)
branchSessions = append(branchSessions,bs1)
return branchSessions
}
func branchSessionProvider() *session.BranchSession {
common.XID.IpAddress="127.0.0.1"
common.XID.Port=9876
transId := util.GeneratorUUID()
bs := session.NewBranchSession().
SetXid(common.XID.GenerateXID(transId)).
SetTransactionId(transId).
SetBranchId(1).
SetResourceGroupId("my_test_tx_group").
SetResourceId("tb_1").
SetLockKey("tb_1:13").
SetBranchType(meta.BranchTypeAT).
SetStatus(meta.BranchStatusUnknown).
SetClientId("c1").
SetApplicationData([]byte("{\"data\":\"test\"}"))
return bs
}