package ztimer /** * @Author: Aceld(刘丹冰) * @Date: 2019/5/9 10:14 * @Mail: danbing.at@gmail.com * * 时间轮定时器调度器单元测试 */ import ( "fmt" "log" "testing" "time" "github.com/aceld/zinx/zlog" ) //触发函数 func foo(args ...interface{}) { fmt.Printf("I am No. %d function, delay %d ms\n", args[0].(int), args[1].(int)) } //手动创建调度器运转时间轮 func TestNewTimerScheduler(t *testing.T) { timerScheduler := NewTimerScheduler() timerScheduler.Start() //在scheduler中添加timer for i := 1; i < 2000; i++ { f := NewDelayFunc(foo, []interface{}{i, i * 3}) tid, err := timerScheduler.CreateTimerAfter(f, time.Duration(3*i)*time.Millisecond) if err != nil { zlog.Error("create timer error", tid, err) break } } //执行调度器触发函数 go func() { delayFuncChan := timerScheduler.GetTriggerChan() for df := range delayFuncChan { df.Call() } }() //阻塞等待 select {} } //采用自动调度器运转时间轮 func TestNewAutoExecTimerScheduler(t *testing.T) { autoTS := NewAutoExecTimerScheduler() //给调度器添加Timer for i := 0; i < 2000; i++ { f := NewDelayFunc(foo, []interface{}{i, i * 3}) tid, err := autoTS.CreateTimerAfter(f, time.Duration(3*i)*time.Millisecond) if err != nil { zlog.Error("create timer error", tid, err) break } } //阻塞等待 select {} } //测试取消一个定时器 func TestCancelTimerScheduler(t *testing.T) { Scheduler := NewAutoExecTimerScheduler() f1 := NewDelayFunc(foo, []interface{}{3, 3}) f2 := NewDelayFunc(foo, []interface{}{5, 5}) timerID1, err := Scheduler.CreateTimerAfter(f1, time.Duration(3)*time.Second) if nil != err { t.Log("Scheduler.CreateTimerAfter(f1, time.Duration(3)*time.Second)", "err:", err) } timerID2, err := Scheduler.CreateTimerAfter(f2, time.Duration(5)*time.Second) if nil != err { t.Log("Scheduler.CreateTimerAfter(f1, time.Duration(3)*time.Second)", "err:", err) } log.Printf("timerId1=%d ,timerId2=%d\n", timerID1, timerID2) Scheduler.CancelTimer(timerID1) //删除timerId1 //阻塞等待 select {} }