Spaces:
Runtime error
Runtime error
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) | |
} | |
} | |