115 lines
1.9 KiB
Plaintext
115 lines
1.9 KiB
Plaintext
package coroutine_timer
|
||
|
||
import (
|
||
"sync"
|
||
"testing"
|
||
"time"
|
||
|
||
"goutil/mathUtil"
|
||
"goutil/stringUtil"
|
||
)
|
||
|
||
func init() {
|
||
}
|
||
|
||
func Test_Method1(t *testing.T) {
|
||
imap := make(map[int]struct{})
|
||
var lockObj sync.Mutex
|
||
|
||
cb := func(obj interface{}) {
|
||
i := obj.(int)
|
||
|
||
lockObj.Lock()
|
||
defer lockObj.Unlock()
|
||
|
||
if _, exist := imap[i]; exist == false {
|
||
t.Error(i, "应该删除,不应该回调 Test_Method1")
|
||
}
|
||
|
||
delete(imap, i)
|
||
}
|
||
|
||
for i := 0; i < 20000; i++ {
|
||
tick := i % 20
|
||
isdel := false
|
||
if tick > 1 {
|
||
isdel = mathUtil.GetRand().GetRandInt(100) < 50
|
||
}
|
||
if isdel == false {
|
||
lockObj.Lock()
|
||
imap[i] = struct{}{}
|
||
lockObj.Unlock()
|
||
}
|
||
id := AddTimer(tick, cb, i)
|
||
if isdel {
|
||
DeleteTimer(id)
|
||
}
|
||
}
|
||
|
||
newN := 10000000
|
||
newId := stringUtil.GetNewUUID()
|
||
|
||
lockObj.Lock()
|
||
imap[newN] = struct{}{}
|
||
lockObj.Unlock()
|
||
|
||
err := AddTimer4(newId, 3, cb, newN)
|
||
if err != nil {
|
||
t.Error(err)
|
||
}
|
||
|
||
err = AddTimer4(newId, 3, cb, newN)
|
||
if err == nil {
|
||
t.Error("未检测到重复id")
|
||
}
|
||
|
||
for {
|
||
if len(imap) == 0 {
|
||
break
|
||
}
|
||
|
||
t.Log("剩余回调次数:", len(imap))
|
||
time.Sleep(time.Second)
|
||
}
|
||
}
|
||
|
||
func Test_Method2(t *testing.T) {
|
||
imap := make(map[int64]struct{})
|
||
var lockObj sync.Mutex
|
||
|
||
cb := func(obj interface{}) {
|
||
i := obj.(int64)
|
||
n := time.Now().Unix()
|
||
x := n - i
|
||
// 此处因为启动有暂停5s,所以启动后最近的执行偏差在5s内
|
||
if x > 6 || x < -6 {
|
||
t.Errorf("错误的时间执行了回调函数 tick:%v now:%v", i, n)
|
||
}
|
||
|
||
lockObj.Lock()
|
||
defer lockObj.Unlock()
|
||
|
||
if _, exist := imap[i]; exist == false {
|
||
t.Error(i, "应该删除,不应该回调 Test_Method2")
|
||
}
|
||
|
||
delete(imap, i)
|
||
}
|
||
|
||
for i := 0; i < 20; i++ {
|
||
tick := time.Now().Unix() + int64(i)
|
||
imap[tick] = struct{}{}
|
||
AddTimer3(tick, cb, tick)
|
||
}
|
||
|
||
for {
|
||
if len(imap) == 0 {
|
||
break
|
||
}
|
||
|
||
t.Log("剩余回调次数:", len(imap))
|
||
time.Sleep(time.Second)
|
||
}
|
||
|
||
}
|