Files
EdgeAPI/internal/db/models/sys_locker_dao_test.go

194 lines
3.2 KiB
Go
Raw Normal View History

2020-09-26 08:06:40 +08:00
package models
import (
"sync"
2020-09-26 08:06:40 +08:00
"testing"
2023-07-02 15:27:49 +08:00
"time"
2024-07-27 14:15:25 +08:00
_ "github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/types"
2020-09-26 08:06:40 +08:00
)
func TestSysLockerDAO_Lock(t *testing.T) {
2021-01-10 17:34:35 +08:00
var tx *dbs.Tx
2023-07-04 22:02:17 +08:00
var dao = NewSysLockerDAO()
isOk, err := dao.Lock(tx, "test", 600)
2020-09-26 08:06:40 +08:00
if err != nil {
t.Fatal(err)
}
t.Log(isOk)
if isOk {
2023-07-04 22:02:17 +08:00
err = dao.Unlock(tx, "test")
2020-09-26 08:06:40 +08:00
if err != nil {
t.Fatal(err)
}
}
}
func TestSysLocker_Increase_SQL(t *testing.T) {
var dao = NewSysLockerDAO()
value, err := dao.Read(nil, "hello")
if err != nil {
t.Fatal(err)
}
t.Log("before:", value)
v, err := dao.Increase(nil, "hello", 0)
if err != nil {
t.Log("err:", err)
return
}
t.Log("after:", v)
}
func TestSysLocker_Increase_New_Key(t *testing.T) {
var key = "KEY" + types.String(time.Now().Unix())
var dao = NewSysLockerDAO()
value, err := dao.Read(nil, key)
if err != nil {
t.Fatal(err)
}
t.Log("before:", value)
for i := 0; i < 2; i++ {
v, err := dao.Increase(nil, key, 0)
if err != nil {
t.Log("err:", err)
return
}
t.Log("after:", v)
}
}
2023-07-20 14:25:42 +08:00
func TestSysLocker_Increase_Cache(t *testing.T) {
var dao = NewSysLockerDAO()
for i := 0; i < 11; i++ {
v, err := dao.Increase(nil, "hello", 0)
if err != nil {
t.Log("err:", err)
return
}
t.Log("hello", i, "after:", v)
}
for i := 0; i < 11; i++ {
v, err := dao.Increase(nil, "hello2", 0)
if err != nil {
t.Log("err:", err)
return
}
t.Log("hello2", i, "after:", v)
}
}
func TestSysLocker_Increase(t *testing.T) {
2023-07-02 15:27:49 +08:00
dbs.NotifyReady()
2023-07-20 14:25:42 +08:00
var dao = NewSysLockerDAO()
dao.Instance.Raw().SetMaxOpenConns(64)
2023-07-02 15:27:49 +08:00
var count = 1000
value, err := dao.Read(nil, "hello")
if err != nil {
t.Fatal(err)
}
t.Log("before", value)
var locker = sync.Mutex{}
var allValueMap = map[int64]bool{}
var before = time.Now()
var wg = sync.WaitGroup{}
wg.Add(count)
for i := 0; i < count; i++ {
2023-07-02 15:27:49 +08:00
go func(i int) {
defer wg.Done()
2023-07-02 15:27:49 +08:00
var key = "hello"
v, err := dao.Increase(nil, key, 0)
if err != nil {
t.Log("err:", err)
return
}
2023-07-02 15:27:49 +08:00
locker.Lock()
if allValueMap[v] {
t.Log("duplicated:", v)
} else {
allValueMap[v] = true
}
locker.Unlock()
//t.Log("v:", v)
_ = v
}(i)
}
wg.Wait()
2023-07-02 15:27:49 +08:00
t.Log("cost:", time.Since(before).Seconds()*1000, "ms")
value, err = dao.Read(nil, "hello")
if err != nil {
t.Fatal(err)
}
t.Log("after", value, "values:", len(allValueMap))
}
func TestSysLocker_Increase_Performance(t *testing.T) {
dbs.NotifyReady()
var count = 1000
var dao = NewSysLockerDAO()
var before = time.Now()
var wg = sync.WaitGroup{}
wg.Add(count)
for i := 0; i < count; i++ {
go func(i int) {
defer wg.Done()
var key = "hello" + types.String(i%10)
v, err := dao.Increase(nil, key, 0)
if err != nil {
t.Log("err:", err)
return
}
//t.Log("v:", v)
_ = v
}(i)
}
wg.Wait()
t.Log("cost:", time.Since(before).Seconds()*1000, "ms")
}
2023-07-04 22:02:17 +08:00
func BenchmarkSysLockerDAO_Increase(b *testing.B) {
var dao = NewSysLockerDAO()
2023-07-20 14:25:42 +08:00
dao.Instance.Raw().SetMaxOpenConns(64)
2023-07-04 22:02:17 +08:00
_, _ = dao.Increase(nil, "hello", 0)
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, err := dao.Increase(nil, "hello", 0)
if err != nil {
b.Fatal(err)
}
}
})
}