github.com/ngicks/gokugen@v0.0.5/middleware/deadline/deadline_test.go (about) 1 package deadline 2 3 import ( 4 "context" 5 "math" 6 "testing" 7 "time" 8 9 "github.com/golang/mock/gomock" 10 "github.com/ngicks/gokugen" 11 mock_gokugen "github.com/ngicks/gokugen/__mock" 12 mock_common "github.com/ngicks/gokugen/common/__mock" 13 "github.com/ngicks/gokugen/middleware/observe" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestDeadline(t *testing.T) { 18 _, mockSched, getTrappedTask := mock_gokugen.BuildMockScheduler(t) 19 ma := gokugen.NewMiddlewareApplicator(mockSched) 20 21 var workErr error 22 observeMw := observe.New(nil, func(_ any, err error) { 23 workErr = err 24 }) 25 // never dies 26 deadlineMw := New(math.MaxInt64, func(ctx gokugen.SchedulerContext) bool { return false }) 27 28 ma.Use( 29 deadlineMw.Middleware, 30 observeMw.Middleware, 31 ) 32 33 inputCtx := gokugen.BuildContext( 34 time.Now(), 35 func(taskCtx context.Context, scheduled time.Time) (any, error) { 36 return "baz", nil 37 }, 38 nil, 39 ) 40 41 ma.Schedule(inputCtx) 42 getTrappedTask().Do(context.TODO()) 43 44 require.Equal(t, nil, workErr) 45 46 // dies however you try 47 deadlineMw.deadline = 0 48 ma.Schedule(inputCtx) 49 getTrappedTask().Do(context.TODO()) 50 51 dee, ok := workErr.(DeadlineExeededErr) 52 require.Equal(t, true, ok) 53 require.Error(t, dee) 54 } 55 56 func TestDeadlineMock(t *testing.T) { 57 ctrl := gomock.NewController(t) 58 mockGetNow := mock_common.NewMockGetNower(ctrl) 59 _, mockSched, getTrappedTask := mock_gokugen.BuildMockScheduler(t) 60 61 ma := gokugen.NewMiddlewareApplicator(mockSched) 62 63 deadlineMw := New(time.Second, func(ctx gokugen.SchedulerContext) bool { return false }) 64 deadlineMw.getNow = mockGetNow 65 var workErr error 66 observeMw := observe.New(nil, func(ret any, err error) { 67 workErr = err 68 }) 69 70 ma.Use( 71 deadlineMw.Middleware, 72 observeMw.Middleware, 73 ) 74 75 psuedoNow := time.Date(2000, time.April, 21, 12, 9, 54, 1, time.UTC) 76 mockGetNow.EXPECT().GetNow().Return(psuedoNow.Add(500 * time.Millisecond)) 77 78 inputCtx := gokugen.BuildContext( 79 psuedoNow, 80 func(taskCtx context.Context, scheduled time.Time) (any, error) { 81 return "baz", nil 82 }, 83 nil, 84 ) 85 86 ma.Schedule(inputCtx) 87 getTrappedTask().Do(context.TODO()) 88 89 require.Equal(t, nil, workErr) 90 91 mockGetNow.EXPECT().GetNow().Return(psuedoNow.Add(time.Second + 500*time.Millisecond)) 92 93 ma.Schedule(inputCtx) 94 getTrappedTask().Do(context.TODO()) 95 96 dee, ok := workErr.(DeadlineExeededErr) 97 require.Equal(t, true, ok) 98 require.Equal(t, psuedoNow, dee.ScheduledTime()) 99 require.Equal(t, psuedoNow.Add(time.Second+500*time.Millisecond), dee.ExecutedTime()) 100 }