| package task | |
| import ( | |
| "sync/atomic" | |
| "testing" | |
| "time" | |
| "github.com/alist-org/alist/v3/pkg/utils" | |
| "github.com/pkg/errors" | |
| ) | |
| func TestTask_Manager(t *testing.T) { | |
| tm := NewTaskManager(3, func(id *uint64) { | |
| atomic.AddUint64(id, 1) | |
| }) | |
| id := tm.Submit(WithCancelCtx(&Task[uint64]{ | |
| Name: "test", | |
| Func: func(task *Task[uint64]) error { | |
| time.Sleep(time.Millisecond * 500) | |
| return nil | |
| }, | |
| })) | |
| task, ok := tm.Get(id) | |
| if !ok { | |
| t.Fatal("task not found") | |
| } | |
| time.Sleep(time.Millisecond * 100) | |
| if task.state != RUNNING { | |
| t.Errorf("task status not running: %s", task.state) | |
| } | |
| time.Sleep(time.Second) | |
| if task.state != SUCCEEDED { | |
| t.Errorf("task status not finished: %s", task.state) | |
| } | |
| } | |
| func TestTask_Cancel(t *testing.T) { | |
| tm := NewTaskManager(3, func(id *uint64) { | |
| atomic.AddUint64(id, 1) | |
| }) | |
| id := tm.Submit(WithCancelCtx(&Task[uint64]{ | |
| Name: "test", | |
| Func: func(task *Task[uint64]) error { | |
| for { | |
| if utils.IsCanceled(task.Ctx) { | |
| return nil | |
| } else { | |
| t.Logf("task is running") | |
| } | |
| } | |
| }, | |
| })) | |
| task, ok := tm.Get(id) | |
| if !ok { | |
| t.Fatal("task not found") | |
| } | |
| time.Sleep(time.Microsecond * 50) | |
| task.Cancel() | |
| time.Sleep(time.Millisecond) | |
| if task.state != CANCELED { | |
| t.Errorf("task status not canceled: %s", task.state) | |
| } | |
| } | |
| func TestTask_Retry(t *testing.T) { | |
| tm := NewTaskManager(3, func(id *uint64) { | |
| atomic.AddUint64(id, 1) | |
| }) | |
| num := 0 | |
| id := tm.Submit(WithCancelCtx(&Task[uint64]{ | |
| Name: "test", | |
| Func: func(task *Task[uint64]) error { | |
| num++ | |
| if num&1 == 1 { | |
| return errors.New("test error") | |
| } | |
| return nil | |
| }, | |
| })) | |
| task, ok := tm.Get(id) | |
| if !ok { | |
| t.Fatal("task not found") | |
| } | |
| time.Sleep(time.Millisecond) | |
| if task.Error == nil { | |
| t.Error(task.state) | |
| t.Fatal("task error is nil, but expected error") | |
| } else { | |
| t.Logf("task error: %s", task.Error) | |
| } | |
| task.retry() | |
| time.Sleep(time.Millisecond) | |
| if task.Error != nil { | |
| t.Errorf("task error: %+v, but expected nil", task.Error) | |
| } | |
| } | |