优化时间的筛选
This commit is contained in:
+56
-16
@@ -3,6 +3,7 @@ package timerx_test
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
@@ -123,18 +124,18 @@ func TestSingleTimer_Deduplication(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
|
||||
// 等待一段时间,检查去重是否生效
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
time.Sleep(250 * time.Millisecond)
|
||||
|
||||
// 应该只有1次执行(因为任务执行需要100ms,50ms的间隔会被去重)
|
||||
assert.Equal(t, int32(1), atomic.LoadInt32(&executionCount))
|
||||
|
||||
t.Logf("warn: %v", mockLogger.Warns)
|
||||
t.Logf("info: %v", mockLogger.Infos)
|
||||
// t.Logf("warn: %+v", mockLogger.Warns)
|
||||
// t.Logf("info: %+v", mockLogger.Infos)
|
||||
fmt.Println("info:", mockLogger.Infos)
|
||||
fmt.Println("warn:", mockLogger.Warns)
|
||||
|
||||
// 检查是否有去重日志
|
||||
assert.Contains(t, mockLogger.Warns, "timer: 任务已执行,跳过本次执行 dedup-test")
|
||||
assert.Contains(t, mockLogger.Infos, "timer: 任务正在执行中,跳过本次 dedup-test")
|
||||
}
|
||||
|
||||
// 测试并发安全
|
||||
@@ -190,11 +191,12 @@ func TestSingleTimer_Timeout(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
mockLogger := &MockLogger{}
|
||||
|
||||
timer := timerx.InitSingle(ctx, timerx.WithLogger(mockLogger))
|
||||
timer := timerx.InitSingle(ctx, timerx.WithLogger(mockLogger), timerx.WithTimeout(1*time.Second))
|
||||
defer timer.Stop()
|
||||
|
||||
// 长时间运行的任务
|
||||
longTask := func(ctx context.Context, data interface{}) error {
|
||||
fmt.Println("long task start")
|
||||
select {
|
||||
case <-time.After(2 * time.Second): // 超过超时时间
|
||||
case <-ctx.Done():
|
||||
@@ -206,10 +208,20 @@ func TestSingleTimer_Timeout(t *testing.T) {
|
||||
_, err := timer.EverySpace(ctx, "timeout-test", 100*time.Millisecond, longTask, nil)
|
||||
assert.NoError(t, err)
|
||||
|
||||
time.Sleep(500 * time.Millisecond)
|
||||
time.Sleep(time.Second * 5)
|
||||
|
||||
// 检查是否有超时相关的错误日志
|
||||
assert.Contains(t, mockLogger.Errors, "context deadline exceeded")
|
||||
if len(mockLogger.Errors) == 0 {
|
||||
t.Fatalf("expected timeout error log, got none")
|
||||
}
|
||||
isTimeout := false
|
||||
for _, err := range mockLogger.Errors {
|
||||
isTimeout = strings.Contains(err, "context deadline exceeded")
|
||||
if isTimeout {
|
||||
break
|
||||
}
|
||||
}
|
||||
assert.True(t, isTimeout)
|
||||
}
|
||||
|
||||
// 测试panic恢复
|
||||
@@ -230,7 +242,18 @@ func TestSingleTimer_PanicRecovery(t *testing.T) {
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
|
||||
// 检查是否有panic恢复日志
|
||||
assert.Contains(t, mockLogger.Errors, "timer: 回调任务panic err")
|
||||
if len(mockLogger.Errors) == 0 {
|
||||
t.Fatalf("expected panic recovery log, got none")
|
||||
}
|
||||
isPanic := false
|
||||
for _, err := range mockLogger.Errors {
|
||||
isPanic = strings.Contains(err, "timer Single call panic err")
|
||||
if isPanic {
|
||||
break
|
||||
}
|
||||
}
|
||||
assert.True(t, isPanic)
|
||||
|
||||
}
|
||||
|
||||
// 测试不同时间类型的任务
|
||||
@@ -274,12 +297,12 @@ func TestSingleTimer_DifferentJobTypes(t *testing.T) {
|
||||
}, nil)
|
||||
assert.NoError(t, err)
|
||||
|
||||
time.Sleep(300 * time.Millisecond)
|
||||
time.Sleep(time.Second)
|
||||
|
||||
// 只有间隔任务应该执行
|
||||
assert.Equal(t, int32(1), atomic.LoadInt32(&counts.space))
|
||||
assert.Equal(t, int32(0), atomic.LoadInt32(&counts.month))
|
||||
assert.Equal(t, int32(0), atomic.LoadInt32(&counts.week))
|
||||
assert.Equal(t, int32(9), atomic.LoadInt32(&counts.space))
|
||||
assert.Equal(t, int32(1), atomic.LoadInt32(&counts.month))
|
||||
assert.Equal(t, int32(1), atomic.LoadInt32(&counts.week))
|
||||
}
|
||||
|
||||
// 测试上下文取消
|
||||
@@ -329,6 +352,7 @@ func TestSingleTimer_ExtendData(t *testing.T) {
|
||||
|
||||
_, err := timer.EverySpace(ctx, "data-test", 100*time.Millisecond,
|
||||
func(ctx context.Context, data interface{}) error {
|
||||
fmt.Println("data:", data)
|
||||
if data != nil {
|
||||
receivedData = data.(*TestData)
|
||||
}
|
||||
@@ -336,7 +360,9 @@ func TestSingleTimer_ExtendData(t *testing.T) {
|
||||
}, testData)
|
||||
assert.NoError(t, err)
|
||||
|
||||
time.Sleep(150 * time.Millisecond)
|
||||
time.Sleep(time.Second)
|
||||
|
||||
t.Logf("receivedData: %+v", receivedData)
|
||||
|
||||
assert.NotNil(t, receivedData)
|
||||
assert.Equal(t, "hello", receivedData.Message)
|
||||
@@ -392,11 +418,15 @@ func TestGetNextTime2(t *testing.T) {
|
||||
jobData := timerx.JobData{
|
||||
JobType: timerx.JobTypeInterval,
|
||||
IntervalTime: time.Minute,
|
||||
// CreateTime: now,
|
||||
BaseTime: now,
|
||||
}
|
||||
|
||||
tt := time.Date(now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), 0, 0, time.UTC)
|
||||
|
||||
nextTime, err := timerx.GetNextTime(now, jobData)
|
||||
assert.NoError(t, err)
|
||||
assert.WithinDuration(t, now.Add(time.Minute), *nextTime, time.Second)
|
||||
assert.WithinDuration(t, tt.Add(time.Minute), *nextTime, time.Second)
|
||||
}
|
||||
|
||||
// 基准测试
|
||||
@@ -433,7 +463,16 @@ func TestSingleTimer_Logging(t *testing.T) {
|
||||
|
||||
// 检查日志记录
|
||||
assert.NotEmpty(t, mockLogger.Errors)
|
||||
assert.Contains(t, mockLogger.Errors[0], "timer: 回调任务panic err")
|
||||
|
||||
if len(mockLogger.Errors) == 0 {
|
||||
t.Fatalf("expected panic recovery log, got none")
|
||||
}
|
||||
isPanic := false
|
||||
for _, err := range mockLogger.Errors {
|
||||
isPanic = strings.Contains(err, "test panic for logging")
|
||||
}
|
||||
assert.True(t, isPanic)
|
||||
|
||||
}
|
||||
|
||||
// 测试时区处理
|
||||
@@ -457,12 +496,13 @@ func TestSingleTimer_Timezone(t *testing.T) {
|
||||
// 添加下一秒执行的任务
|
||||
_, err := timer.EverySpace(ctx, "tz-test", time.Second,
|
||||
func(ctx context.Context, data interface{}) error {
|
||||
fmt.Println("executed in location:", loc)
|
||||
executed = true
|
||||
return nil
|
||||
}, nil)
|
||||
assert.NoError(t, err)
|
||||
|
||||
time.Sleep(1500 * time.Millisecond)
|
||||
time.Sleep(5 * time.Second)
|
||||
assert.True(t, executed)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user