|
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) |
|
} |
|
} |
|
|