forked from pallat/queue
-
Notifications
You must be signed in to change notification settings - Fork 0
/
manager_test.go
128 lines (97 loc) · 1.92 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
package queue
import (
"context"
"errors"
"fmt"
"testing"
"time"
)
type work int
func (w *work) Do(v interface{}) interface{} {
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{}) interface{} {
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{}) interface{} {
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{}) interface{} {
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)
}
}