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  }