Files
monibuca/pkg/task/task_test.go
2024-08-30 16:14:02 +08:00

172 lines
3.4 KiB
Go

package task
import (
"context"
"errors"
"io"
"log/slog"
"os"
"sync/atomic"
"testing"
"time"
)
var root Work
func init() {
root.Context, root.CancelCauseFunc = context.WithCancelCause(context.Background())
root.handler = &root
root.Logger = slog.New(slog.NewTextHandler(os.Stdout, nil))
slog.SetLogLoggerLevel(slog.LevelDebug)
}
func Test_AddTask_AddsTaskSuccessfully(t *testing.T) {
var task Task
root.AddTask(&task)
_ = task.WaitStarted()
if len(root.children) != 1 {
t.Errorf("expected 1 child task, got %d", len(root.children))
}
}
type retryDemoTask struct {
Task
}
func (task *retryDemoTask) Start() error {
return io.ErrClosedPipe
}
func Test_RetryTask(t *testing.T) {
var demoTask retryDemoTask
demoTask.SetRetry(3, time.Second)
reason := root.AddTask(&demoTask).WaitStopped()
if !errors.Is(reason, ErrRetryRunOut) {
t.Errorf("expected retry run out, got %v", reason)
}
if demoTask.retry.RetryCount != 3 {
t.Errorf("expected 3 retries, got %d", demoTask.retry.RetryCount)
}
}
func Test_Call_ExecutesCallback(t *testing.T) {
called := false
root.Call(func() error {
called = true
return nil
})
if !called {
t.Errorf("expected callback to be called")
}
}
func Test_StopByContext(t *testing.T) {
var task Task
ctx, cancel := context.WithCancel(context.Background())
root.AddTask(&task, ctx)
time.AfterFunc(time.Millisecond*100, cancel)
if !errors.Is(task.WaitStopped(), context.Canceled) {
t.Errorf("expected task to be stopped by context")
}
}
func Test_ParentStop(t *testing.T) {
var parent Job
root.AddTask(&parent)
var called atomic.Uint32
var task Task
checkCalled := func(expected uint32) {
if count := called.Add(1); count != expected {
t.Errorf("expected %d, got %d", expected, count)
}
}
task.OnDispose(func() {
checkCalled(1)
})
parent.OnDispose(func() {
checkCalled(2)
})
parent.AddTask(&task)
parent.Stop(ErrAutoStop)
if !errors.Is(task.WaitStopped(), ErrAutoStop) {
t.Errorf("expected task auto stop")
}
}
func Test_ParentAutoStop(t *testing.T) {
var parent Job
root.AddTask(&parent)
var called atomic.Uint32
var task Task
checkCalled := func(expected uint32) {
if count := called.Add(1); count != expected {
t.Errorf("expected %d, got %d", expected, count)
}
}
task.OnDispose(func() {
checkCalled(1)
})
parent.OnDispose(func() {
checkCalled(2)
})
parent.AddTask(&task)
time.AfterFunc(time.Second, func() {
task.Stop(ErrTaskComplete)
})
if !errors.Is(parent.WaitStopped(), ErrAutoStop) {
t.Errorf("expected task auto stop")
}
}
func Test_Hooks(t *testing.T) {
var called atomic.Uint32
var task Task
checkCalled := func(expected uint32) {
if count := called.Add(1); count != expected {
t.Errorf("expected %d, got %d", expected, count)
}
}
task.OnStart(func() {
checkCalled(1)
})
task.OnDispose(func() {
checkCalled(3)
})
task.OnStart(func() {
checkCalled(2)
})
task.OnDispose(func() {
checkCalled(4)
})
root.AddTask(&task).WaitStopped()
}
//type DemoTask struct {
// Task
// file *os.File
// filePath string
//}
//
//func (d *DemoTask) Start() (err error) {
// d.file, err = os.Open(d.filePath)
// return
//}
//
//func (d *DemoTask) Run() (err error) {
// _, err = d.file.Write([]byte("hello"))
// return
//}
//
//func (d *DemoTask) Dispose() {
// d.file.Close()
//}
//
//type HelloWorld struct {
// DemoTask
//}
//
//func (h *HelloWorld) Run() (err error) {
// _, err = h.file.Write([]byte("world"))
// return nil
//}