github.com/webx-top/com@v1.2.12/goroutine_test.go (about) 1 package com 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 "math" 8 "sync" 9 "sync/atomic" 10 "testing" 11 "time" 12 13 "github.com/stretchr/testify/assert" 14 ) 15 16 func TestLoop(t *testing.T) { 17 ctx, cancel := context.WithCancel(context.Background()) 18 go Loop(ctx, func() error { 19 fmt.Println(`Loop`, time.Now()) 20 return nil 21 }, time.Second*1) 22 time.Sleep(time.Second * 5) 23 cancel() 24 } 25 26 func TestDelayOnceNormal(t *testing.T) { 27 d := NewDelayOnce(time.Second*2, time.Hour, true) 28 defer d.Close() 29 ctx := context.TODO() 30 wg := sync.WaitGroup{} 31 var lastTime time.Time 32 var execTime time.Time 33 var counter atomic.Int32 34 for i := 0; i < 10; i++ { 35 log.Println(`Trigger key_normal`) 36 lastTime = time.Now() 37 isNew := d.Do(ctx, `key_normal`, func() error { 38 defer wg.Done() 39 log.Println(`>Execute key_normal<`) 40 execTime = time.Now() 41 time.Sleep(time.Second * 3) 42 counter.Add(1) 43 return nil 44 }) 45 if isNew { 46 wg.Add(1) 47 } 48 //time.Sleep(time.Second * 2) 49 } 50 wg.Wait() 51 assert.Equal(t, float64(2), math.Floor(execTime.Sub(lastTime).Seconds())) 52 assert.Equal(t, int32(1), counter.Load()) 53 } 54 55 func TestDelayOnceTimeout(t *testing.T) { 56 d := NewDelayOnce(time.Second*2, time.Second*5, true) 57 defer d.Close() 58 ctx := context.TODO() 59 wg := sync.WaitGroup{} 60 var lastTime time.Time 61 var execTime time.Time 62 var counter atomic.Int32 63 for i := 0; i < 3; i++ { 64 log.Println(`Trigger key_timeout`) 65 lastTime = time.Now() 66 isNew := d.DoWithState(ctx, `key_timeout`, func(isAbort func() bool) error { 67 defer wg.Done() 68 execTime = time.Now() 69 for i := 0; i < 4; i++ { 70 if isAbort() { 71 log.Println(`------> Stop key_timeout`) 72 return nil 73 } 74 log.Println(`Execute key_timeout`, i) 75 time.Sleep(time.Second * 5) 76 } 77 log.Println(`>Execute key_timeout<`) 78 counter.Add(1) 79 return nil 80 }) 81 if isNew { 82 wg.Add(1) 83 } 84 //time.Sleep(time.Second * 6) 85 } 86 wg.Wait() 87 assert.Equal(t, float64(2), math.Floor(execTime.Sub(lastTime).Seconds())) 88 assert.Equal(t, int32(1), counter.Load()) 89 }