Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/pkg/task/task_test.go
1560 views
1
package task
2
3
import (
4
"sync/atomic"
5
"testing"
6
"time"
7
8
"github.com/alist-org/alist/v3/pkg/utils"
9
"github.com/pkg/errors"
10
)
11
12
func TestTask_Manager(t *testing.T) {
13
tm := NewTaskManager(3, func(id *uint64) {
14
atomic.AddUint64(id, 1)
15
})
16
id := tm.Submit(WithCancelCtx(&Task[uint64]{
17
Name: "test",
18
Func: func(task *Task[uint64]) error {
19
time.Sleep(time.Millisecond * 500)
20
return nil
21
},
22
}))
23
task, ok := tm.Get(id)
24
if !ok {
25
t.Fatal("task not found")
26
}
27
time.Sleep(time.Millisecond * 100)
28
if task.state != RUNNING {
29
t.Errorf("task status not running: %s", task.state)
30
}
31
time.Sleep(time.Second)
32
if task.state != SUCCEEDED {
33
t.Errorf("task status not finished: %s", task.state)
34
}
35
}
36
37
func TestTask_Cancel(t *testing.T) {
38
tm := NewTaskManager(3, func(id *uint64) {
39
atomic.AddUint64(id, 1)
40
})
41
id := tm.Submit(WithCancelCtx(&Task[uint64]{
42
Name: "test",
43
Func: func(task *Task[uint64]) error {
44
for {
45
if utils.IsCanceled(task.Ctx) {
46
return nil
47
} else {
48
t.Logf("task is running")
49
}
50
}
51
},
52
}))
53
task, ok := tm.Get(id)
54
if !ok {
55
t.Fatal("task not found")
56
}
57
time.Sleep(time.Microsecond * 50)
58
task.Cancel()
59
time.Sleep(time.Millisecond)
60
if task.state != CANCELED {
61
t.Errorf("task status not canceled: %s", task.state)
62
}
63
}
64
65
func TestTask_Retry(t *testing.T) {
66
tm := NewTaskManager(3, func(id *uint64) {
67
atomic.AddUint64(id, 1)
68
})
69
num := 0
70
id := tm.Submit(WithCancelCtx(&Task[uint64]{
71
Name: "test",
72
Func: func(task *Task[uint64]) error {
73
num++
74
if num&1 == 1 {
75
return errors.New("test error")
76
}
77
return nil
78
},
79
}))
80
task, ok := tm.Get(id)
81
if !ok {
82
t.Fatal("task not found")
83
}
84
time.Sleep(time.Millisecond)
85
if task.Error == nil {
86
t.Error(task.state)
87
t.Fatal("task error is nil, but expected error")
88
} else {
89
t.Logf("task error: %s", task.Error)
90
}
91
task.retry()
92
time.Sleep(time.Millisecond)
93
if task.Error != nil {
94
t.Errorf("task error: %+v, but expected nil", task.Error)
95
}
96
}
97
98