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  }