github.com/ngicks/gokugen@v0.0.5/scheduler/task_timer_test.go (about) 1 package scheduler_test 2 3 import ( 4 "context" 5 "testing" 6 "time" 7 8 "github.com/ngicks/gokugen/common" 9 "github.com/ngicks/gokugen/scheduler" 10 ) 11 12 func TestTaskTimer(t *testing.T) { 13 14 now := time.Now() 15 g := getNowDummyImpl{ 16 dummy: now, 17 } 18 19 tasks := make([]*scheduler.Task, 0, 100) 20 for i := int64(0); i < 100; i++ { 21 tasks = append( 22 tasks, 23 scheduler.NewTask( 24 now.Add(time.Duration(i*int64(time.Microsecond))), 25 func(taskCtx context.Context, scheduled time.Time) {}, 26 ), 27 ) 28 } 29 30 f := scheduler.NewTaskTimer(0, &g, common.NewTimerImpl()) 31 32 var task []*scheduler.Task 33 task = f.GetScheduledTask(now) 34 if len(task) != 0 { 35 t.Fatalf("not 0: %d", len(task)) 36 } 37 38 for _, tt := range tasks { 39 f.Push(tt) 40 } 41 42 task = f.GetScheduledTask(now) 43 if len(task) != 1 { 44 t.Fatalf("not 1: %d", len(task)) 45 } 46 if task[0] != tasks[0] { 47 t.Fatalf("not matching") 48 } 49 50 task = f.GetScheduledTask(now.Add(50 * time.Microsecond)) 51 if len(task) != 50 { 52 t.Fatalf("not 50: %d", len(task)) 53 } 54 if task[0] != tasks[1] { 55 t.Fatalf("not matching") 56 } 57 if task[49] != tasks[50] { 58 t.Fatalf("not matching") 59 } 60 61 task = f.GetScheduledTask(now.Add(1000 * time.Microsecond)) 62 if len(task) != 49 { 63 t.Fatalf("not 49: %d", len(task)) 64 } 65 66 f.Stop() 67 } 68 69 func TestTaskTimerReset(t *testing.T) { 70 now := time.Now() 71 g := getNowDummyImpl{ 72 dummy: now, 73 } 74 75 dummyTimer := func() *timerDummyImpl { 76 timer := time.NewTimer(time.Nanosecond) 77 if !timer.Stop() { 78 <-timer.C 79 } 80 return &timerDummyImpl{timer: common.NewTimerImpl()} 81 }() 82 83 f := scheduler.NewTaskTimer(0, &g, dummyTimer) 84 85 f.Push(scheduler.NewTask( 86 now.Add(-2*time.Second), 87 func(taskCtx context.Context, scheduled time.Time) {}, 88 )) 89 90 if d := dummyTimer.resetArg[0]; len(dummyTimer.resetArg) != 1 || d != -2*time.Second { 91 t.Fatalf("reset duration is not as intended; must be %d, but is %d", -2*time.Second, d) 92 } 93 94 f.Push(scheduler.NewTask( 95 now.Add(-time.Second), 96 func(taskCtx context.Context, scheduled time.Time) {}, 97 )) 98 99 if len(dummyTimer.resetArg) != 1 { 100 t.Fatalf("reset must not happen") 101 } 102 103 f.GetScheduledTask(now) 104 105 f.Push(scheduler.NewTask( 106 now.Add(5*time.Second), 107 func(taskCtx context.Context, scheduled time.Time) {}, 108 )) 109 110 if d := dummyTimer.resetArg[1]; len(dummyTimer.resetArg) != 2 || d != 5*time.Second { 111 t.Fatalf("reset duration is not as intended; must be %d, but is %d", 5*time.Second, d) 112 } 113 114 f.Push(scheduler.NewTask( 115 now.Add(3*time.Second), 116 func(taskCtx context.Context, scheduled time.Time) {}, 117 )) 118 119 if d := dummyTimer.resetArg[2]; len(dummyTimer.resetArg) != 3 || d != 3*time.Second { 120 t.Fatalf("reset duration is not as intended; must be %d, but is %d", 3*time.Second, d) 121 } 122 123 f.GetScheduledTask(now.Add(3 * time.Second)) 124 125 if d := dummyTimer.resetArg[3]; len(dummyTimer.resetArg) != 4 || d != 5*time.Second { 126 t.Fatalf("reset duration is not as intended; must be %d, but is %d", 5*time.Second, d) 127 } 128 129 f.GetScheduledTask(now.Add(5 * time.Second)) 130 131 if len(dummyTimer.resetArg) != 4 { 132 t.Fatalf("reset must not happen") 133 } 134 } 135 136 func TestTaskTimerEarlierThanNow(t *testing.T) { 137 138 }