-
Notifications
You must be signed in to change notification settings - Fork 2
/
manager_test.go
158 lines (119 loc) · 2.51 KB
/
manager_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package queue
import (
"context"
"errors"
"fmt"
"testing"
"time"
)
type work int
func (w *work) Do(v interface{}) error {
fmt.Printf("-->%#v\n%#v\n", w, v)
*w++
return nil
}
func TestQueuManager(t *testing.T) {
s := mySimpler{i: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
var w work
ctx := context.Background()
m := NewManager(ctx, &w, s)
go m.Do()
go m.Do()
go m.Do()
go m.Do()
go m.Do()
go m.Do()
<-m.End()
if w != 10 {
t.Error("not finish", w)
}
}
type slow int
func (w *slow) Do(v interface{}) error {
time.Sleep(500 * time.Millisecond)
*w++
fmt.Println(w, v)
return nil
}
func TestQueuManagerTimeout(t *testing.T) {
// items := []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
s := mySimpler{i: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
var w slow
ctx, cancel := context.WithTimeout(context.Background(), 300*time.Millisecond)
defer cancel()
m := NewManager(ctx, &w, s)
go m.Do()
go m.Do()
go m.Do()
go m.Do()
<-m.End()
if w == 10 {
t.Error("not timeout", w)
}
}
type workPanic int
func (w *workPanic) Do(v interface{}) error {
defer func() {
if r := recover(); r != nil {
fmt.Println(r)
}
}()
panic(errors.New("fail"))
return nil
}
func TestQueuManagerWhenWorkerHasPanic(t *testing.T) {
s := mySimpler{i: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
var w workPanic
ctx := context.Background()
m := NewManager(ctx, &w, s)
go m.Do()
go m.Do()
<-m.End()
if w != 0 {
t.Error("not finish", w)
}
}
type workError int
func (w *workError) Do(v interface{}) error {
if (v.(int) % 2) == 0 {
return errors.New("it's error")
}
return nil
}
func TestQueuManagerWhenWorkerHasError(t *testing.T) {
s := mySimpler{i: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
var w workError
ctx := context.Background()
m := NewManager(ctx, &w, s)
go m.Do()
go m.Do()
<-m.End()
if w != 0 {
t.Error("not finish", w)
}
for err := range m.Response() {
fmt.Println("---->", err)
}
}
func TestQueuManagerAssignGoRoutineNumber(t *testing.T) {
s := mySimpler{i: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
var w work
ctx := context.Background()
m := NewManager(ctx, &w, s)
m.Parallel(12)
if w != 10 {
t.Error("not finish", w)
}
}
func TestInterrupt(t *testing.T) {
s := mySimpler{i: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}}
var w slow
ctx, cancel := context.WithCancel(context.Background())
m := NewManager(ctx, &w, s)
go m.Parallel(2)
<-time.After(1 * time.Second)
cancel()
if w > 4 {
t.Error("it should not finish more than 4 but finished", w)
}
}