From 5c580ed01333bfb99032ca33de9115b0224bbdca Mon Sep 17 00:00:00 2001 From: dudaodong Date: Fri, 9 Aug 2024 15:00:19 +0800 Subject: [PATCH] test: update test for Schedule --- function/function.go | 6 ++++-- function/function_test.go | 38 +++++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/function/function.go b/function/function.go index 221c9053..9075c551 100644 --- a/function/function.go +++ b/function/function.go @@ -164,16 +164,18 @@ func Throttle(fn func(), interval time.Duration) func() { // Schedule invoke function every duration time, util close the returned bool channel. // Play: https://go.dev/play/p/hbON-Xeyn5N -func Schedule(d time.Duration, fn any, args ...any) chan bool { +func Schedule(duration time.Duration, fn any, args ...any) chan bool { // Catch programming error while constructing the closure mustBeFunction(fn) quit := make(chan bool) + go func() { for { unsafeInvokeFunc(fn, args...) + select { - case <-time.After(d): + case <-time.After(duration): case <-quit: return } diff --git a/function/function_test.go b/function/function_test.go index f334cff7..4ff33a59 100644 --- a/function/function_test.go +++ b/function/function_test.go @@ -268,23 +268,35 @@ func TestThrottle(t *testing.T) { } func TestSchedule(t *testing.T) { - // assert := internal.NewAssert(t, "TestSchedule") + assert := internal.NewAssert(t, "TestSchedule") - var res []string - appendStr := func(s string) { - res = append(res, s) - } + t.Run("Single call", func(t *testing.T) { + res := []string{} + appendStr := func(s string) { + res = append(res, s) + } + stop := Schedule(200*time.Millisecond, appendStr, "*") + close(stop) + + time.Sleep(400 * time.Millisecond) + + assert.Equal([]string{"*"}, res) + }) + + t.Run("Multiple calls", func(t *testing.T) { + res := []string{} + appendStr := func(s string) { + res = append(res, s) + } + stop := Schedule(200*time.Millisecond, appendStr, "*") - stop := Schedule(1*time.Second, appendStr, "*") - time.Sleep(5 * time.Second) - close(stop) + time.Sleep(800 * time.Millisecond) - t.Log(res) + close(stop) + + assert.Equal([]string{"*", "*", "*", "*"}, res) + }) - // todo: in github action, for now, this test is not working sometimes - // res maybe [* * * * *] or [* * * * * *] - // expected := []string{"*", "*", "*", "*", "*"} - // assert.Equal(expected, res) } func TestPipeline(t *testing.T) {