5
5
"math"
6
6
"testing"
7
7
8
+ "github.com/stretchr/testify/assert"
9
+ "github.com/stretchr/testify/require"
10
+
8
11
"github.com/grafana/pyroscope/pkg/util/loser"
9
12
)
10
13
@@ -13,6 +16,8 @@ type List struct {
13
16
cur uint64
14
17
15
18
err error
19
+
20
+ closed int
16
21
}
17
22
18
23
func NewList (list ... uint64 ) * List {
@@ -26,6 +31,9 @@ func (it *List) At() uint64 {
26
31
func (it * List ) Err () error { return it .err }
27
32
28
33
func (it * List ) Next () bool {
34
+ if it .err != nil {
35
+ return false
36
+ }
29
37
if len (it .list ) > 0 {
30
38
it .cur = it .list [0 ]
31
39
it .list = it .list [1 :]
@@ -35,7 +43,12 @@ func (it *List) Next() bool {
35
43
return false
36
44
}
37
45
46
+ func (it * List ) Close () { it .closed += 1 }
47
+
38
48
func (it * List ) Seek (val uint64 ) bool {
49
+ if it .err != nil {
50
+ return false
51
+ }
39
52
for it .cur < val && len (it .list ) > 0 {
40
53
it .cur = it .list [0 ]
41
54
it .list = it .list [1 :]
@@ -150,34 +163,74 @@ func TestPush(t *testing.T) {
150
163
}
151
164
152
165
func TestInitWithErr (t * testing.T ) {
153
- l := NewList ()
154
- l .err = errors .New ("test" )
155
- l2 := NewList (5 , 6 , 7 , 8 )
156
- tree := loser .New ([]* List {l , l2 }, math .MaxUint64 , func (s * List ) uint64 { return s .At () }, func (a , b uint64 ) bool { return a < b }, func (s * List ) {})
157
-
166
+ lists := []* List {
167
+ NewList (),
168
+ NewList (5 , 6 , 7 , 8 ),
169
+ }
170
+ lists [0 ].err = testErr
171
+ tree := loser .New (lists , math .MaxUint64 , func (s * List ) uint64 { return s .At () }, func (a , b uint64 ) bool { return a < b }, func (s * List ) { s .Close () })
158
172
if tree .Next () {
159
173
t .Errorf ("Next() should have returned false" )
160
174
}
161
- if tree .Err () != l .err {
162
- t .Errorf ("Err() should have returned %v, got %v" , l .err , tree .Err ())
175
+ if tree .Err () != testErr {
176
+ t .Errorf ("Err() should have returned %v, got %v" , testErr , tree .Err ())
177
+ }
178
+
179
+ tree .Close ()
180
+ for _ , l := range lists {
181
+ assert .Equal (t , l .closed , 1 , "list %+#v not closed exactly once" , l )
163
182
}
183
+
164
184
}
165
185
186
+ var testErr = errors .New ("test" )
187
+
166
188
func TestErrDuringNext (t * testing.T ) {
167
- l := NewList (5 )
168
- l .err = errors .New ("test" )
169
- tree := loser .New ([]* List {l }, math .MaxUint64 , func (s * List ) uint64 { return s .At () }, func (a , b uint64 ) bool { return a < b }, func (s * List ) {})
189
+ lists := []* List {
190
+ NewList (5 , 6 ),
191
+ NewList (11 , 12 ),
192
+ }
193
+ tree := loser .New (lists , math .MaxUint64 , func (s * List ) uint64 { return s .At () }, func (a , b uint64 ) bool { return a < b }, func (s * List ) { s .Close () })
170
194
195
+ // no error for first element
171
196
if ! tree .Next () {
172
197
t .Errorf ("Next() should have returned true" )
173
198
}
199
+ // now error for second
200
+ lists [0 ].err = testErr
174
201
if tree .Next () {
175
202
t .Errorf ("Next() should have returned false" )
176
203
}
177
- if tree .Err () != l . err {
178
- t .Errorf ("Err() should have returned %v, got %v" , l . err , tree .Err ())
204
+ if tree .Err () != testErr {
205
+ t .Errorf ("Err() should have returned %v, got %v" , testErr , tree .Err ())
179
206
}
180
207
if tree .Next () {
181
208
t .Errorf ("Next() should have returned false" )
182
209
}
210
+
211
+ tree .Close ()
212
+ for _ , l := range lists {
213
+ assert .Equal (t , l .closed , 1 , "list %+#v not closed exactly once" , l )
214
+ }
215
+ }
216
+
217
+ func TestErrInOneIterator (t * testing.T ) {
218
+ l := NewList ()
219
+ l .err = errors .New ("test" )
220
+
221
+ lists := []* List {
222
+ NewList (5 , 1 ),
223
+ l ,
224
+ NewList (2 , 4 ),
225
+ }
226
+ tree := loser .New (lists , math .MaxUint64 , func (s * List ) uint64 { return s .At () }, func (a , b uint64 ) bool { return a < b }, func (s * List ) { s .Close () })
227
+
228
+ // error for first element
229
+ require .False (t , tree .Next ())
230
+ assert .Equal (t , l .err , tree .Err ())
231
+
232
+ tree .Close ()
233
+ for _ , l := range lists {
234
+ assert .Equal (t , l .closed , 1 , "list %+#v not closed exactly once" , l )
235
+ }
183
236
}
0 commit comments