@@ -21,7 +21,7 @@ func TestChanBatcher(t *testing.T) {
21
21
return batchRate , 2
22
22
}, func (tasks []* ChanTask [time.Duration ]) { batchFn (tasks ) })
23
23
var cnt atomic.Uint32
24
- start := time .Now ()
24
+ var start time.Time
25
25
batchFn = func (tasks []* ChanTask [time.Duration ]) {
26
26
cnt .Add (1 )
27
27
for _ , task := range tasks {
@@ -31,29 +31,54 @@ func TestChanBatcher(t *testing.T) {
31
31
task0 := NewChanTask [time.Duration ](ctx )
32
32
task1 := NewChanTask [time.Duration ](ctx )
33
33
task2 := NewChanTask [time.Duration ](ctx )
34
+ task3 := NewChanTask [time.Duration ](ctx )
34
35
35
36
t .Run ("happy" , func (t * testing.T ) {
36
- batcher .Batch (task0 )
37
- batcher .Batch (task1 )
38
- _ , _ = task0 .Result ()
39
- assert .EqualValues (t , 1 , cnt .Load ())
40
- assert .NoError (t , task0 .Err )
41
- assert .Less (t , task0 .Ret , batchRate )
42
- ret , err := task1 .Result ()
43
- assert .NoError (t , err )
44
- assert .Less (t , ret , batchRate )
45
- time .Sleep (batchRate * 11 / 10 )
46
- runtime .Gosched ()
37
+ t .Run ("trigger max" , func (t * testing.T ) {
38
+ start = time .Now ()
39
+ batcher .Batch (task0 )
40
+ batcher .Batch (task1 )
41
+ _ , _ = task0 .Result ()
42
+ assert .EqualValues (t , 1 , cnt .Load ())
43
+ assert .NoError (t , task0 .Err )
44
+ assert .Less (t , task0 .Ret , batchRate )
45
+ ret , err := task1 .Result ()
46
+ assert .NoError (t , err )
47
+ assert .Less (t , ret , batchRate )
48
+ time .Sleep (batchRate * 11 / 10 )
49
+ runtime .Gosched ()
50
+ })
47
51
48
- batcher .Batch (task2 )
49
- assert .False (t , task2 .IsDone ())
50
- ret , err = task2 .Result ()
51
- assert .True (t , task2 .IsDone ())
52
- assert .EqualValues (t , 2 , cnt .Load ())
53
- assert .Equal (t , task2 .Err , err )
54
- assert .NoError (t , task2 .Err )
55
- assert .Equal (t , task2 .Ret , ret )
56
- assert .Greater (t , ret , batchRate )
52
+ t .Run ("trigger timer after blocked by .Result()" , func (t * testing.T ) {
53
+ start = time .Now ()
54
+ batcher .Batch (task2 )
55
+ assert .False (t , task2 .IsDone ())
56
+ ret , err := task2 .Result ()
57
+ assert .True (t , task2 .IsDone ())
58
+ assert .EqualValues (t , 2 , cnt .Load ())
59
+ assert .Equal (t , task2 .Err , err )
60
+ assert .NoError (t , task2 .Err )
61
+ assert .Equal (t , task2 .Ret , ret )
62
+ assert .Greater (t , ret , batchRate )
63
+ })
64
+
65
+ t .Run ("trigger flush" , func (t * testing.T ) {
66
+ start = time .Now ()
67
+ batcher .Batch (task3 )
68
+ assert .False (t , task3 .IsDone ())
69
+ batcher .Flush ()
70
+ batcher .Flush ()
71
+ ret , err := task3 .Result ()
72
+ assert .True (t , task3 .IsDone ())
73
+ assert .EqualValues (t , 3 , cnt .Load ())
74
+ assert .Equal (t , task3 .Err , err )
75
+ assert .NoError (t , task3 .Err )
76
+ assert .Equal (t , task3 .Ret , ret )
77
+ assert .Less (t , ret , batchRate )
78
+ batcher .Flush ()
79
+ batcher .Flush ()
80
+ assert .EqualValues (t , 3 , cnt .Load ())
81
+ })
57
82
})
58
83
59
84
t .Run ("spam" , func (t * testing.T ) {
@@ -111,13 +136,14 @@ func TestChanBatcher(t *testing.T) {
111
136
assert .ErrorIs (t , task0 .Err , panicErr )
112
137
assert .ErrorIs (t , task1 .Err , panicErr )
113
138
139
+ start = time .Now ()
114
140
batchFn = oldBatchFn
115
141
task2 = NewChanTask [time.Duration ](nil ) // nolint:staticcheck
116
142
batcher .Batch (task2 )
117
143
batcher .Batch (task2 )
118
144
ret , err := task2 .Result ()
119
145
assert .NoError (t , err )
120
- assert .Greater (t , ret , batchRate )
146
+ assert .Less (t , ret , batchRate )
121
147
})
122
148
123
149
t .Run ("cancelled task" , func (t * testing.T ) {
0 commit comments