78 lines
1.7 KiB
Go
78 lines
1.7 KiB
Go
// Package task_test 包含对 task 包的单元测试
|
|
package task_test
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/config"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
|
)
|
|
|
|
// testLogger 是一个用于所有测试用例的静默 logger 实例。
|
|
var testLogger *logs.Logger
|
|
|
|
func init() {
|
|
// 使用 "fatal" 级别来创建一个在测试期间不会产生任何输出的 logger。
|
|
// 这避免了在运行 `go test` 时被日志淹没。
|
|
cfg := config.LogConfig{Level: "fatal"}
|
|
testLogger = logs.NewLogger(cfg)
|
|
}
|
|
|
|
// MockTask 用于测试的模拟任务
|
|
type MockTask struct {
|
|
id string
|
|
priority int
|
|
isDone bool
|
|
execute func() error
|
|
executed int32 // 使用原子操作来跟踪执行次数
|
|
}
|
|
|
|
// Execute 实现了 Task 接口,并确保每次调用都增加执行计数
|
|
func (m *MockTask) Execute() error {
|
|
atomic.AddInt32(&m.executed, 1)
|
|
if m.execute != nil {
|
|
return m.execute()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (m *MockTask) GetID() string {
|
|
return m.id
|
|
}
|
|
|
|
func (m *MockTask) GetPriority() int {
|
|
return m.priority
|
|
}
|
|
|
|
func (m *MockTask) IsDone() bool {
|
|
return m.isDone
|
|
}
|
|
|
|
// ExecutedCount 返回任务被执行的次数
|
|
func (m *MockTask) ExecutedCount() int32 {
|
|
return atomic.LoadInt32(&m.executed)
|
|
}
|
|
|
|
func (m *MockTask) GetDescription() string {
|
|
return "Mock Task"
|
|
}
|
|
|
|
// --- 健壮等待的辅助函数 ---
|
|
func waitForWaitGroup(t *testing.T, wg *sync.WaitGroup, timeout time.Duration) {
|
|
waitChan := make(chan struct{})
|
|
go func() {
|
|
defer close(waitChan)
|
|
wg.Wait()
|
|
}()
|
|
|
|
select {
|
|
case <-waitChan:
|
|
// 等待成功
|
|
case <-time.After(timeout):
|
|
t.Fatal("等待任务完成超时")
|
|
}
|
|
}
|