@@ -3,6 +3,7 @@ package ipldutil
3
3
import (
4
4
"bytes"
5
5
"context"
6
+ "math"
6
7
"testing"
7
8
"time"
8
9
@@ -56,7 +57,7 @@ func TestTraverser(t *testing.T) {
56
57
testdata .MiddleMapBlock ,
57
58
testdata .LeafAlphaBlock ,
58
59
testdata .LeafAlphaBlock ,
59
- })
60
+ }, nil )
60
61
})
61
62
62
63
t .Run ("traverses correctly, blockchain" , func (t * testing.T ) {
@@ -86,13 +87,58 @@ func TestTraverser(t *testing.T) {
86
87
blockChain .VerifyWholeChainWithTypes (ctx , inProgressChan )
87
88
close (done )
88
89
}()
89
- checkTraverseSequence (ctx , t , traverser , blockChain .AllBlocks ())
90
+ checkTraverseSequence (ctx , t , traverser , blockChain .AllBlocks (), nil )
90
91
close (inProgressChan )
91
92
testutil .AssertDoesReceive (ctx , t , done , "should have completed verification but did not" )
92
93
})
94
+
95
+ t .Run ("errors correctly, with budget" , func (t * testing.T ) {
96
+ store := make (map [ipld.Link ][]byte )
97
+ persistence := testutil .NewTestStore (store )
98
+ blockChain := testutil .SetupBlockChain (ctx , t , persistence , 100 , 10 )
99
+ traverser := TraversalBuilder {
100
+ Root : blockChain .TipLink ,
101
+ Selector : blockChain .Selector (),
102
+ Chooser : blockChain .Chooser ,
103
+ LinkSystem : persistence ,
104
+ Visitor : func (tp traversal.Progress , node ipld.Node , r traversal.VisitReason ) error {
105
+ return nil
106
+ },
107
+ Budget : & traversal.Budget {
108
+ NodeBudget : math .MaxInt64 ,
109
+ LinkBudget : 6 ,
110
+ },
111
+ }.Start (ctx )
112
+ var path ipld.Path
113
+ for i := 0 ; i < 6 ; i ++ {
114
+ path = path .AppendSegment (ipld .PathSegmentOfString ("Parents" ))
115
+ path = path .AppendSegment (ipld .PathSegmentOfInt (0 ))
116
+ }
117
+ checkTraverseSequence (ctx , t , traverser , blockChain .Blocks (0 , 6 ), & traversal.ErrBudgetExceeded {BudgetKind : "link" , Path : path , Link : blockChain .LinkTipIndex (6 )})
118
+ })
119
+
120
+ t .Run ("errors correctly, no budget" , func (t * testing.T ) {
121
+ store := make (map [ipld.Link ][]byte )
122
+ persistence := testutil .NewTestStore (store )
123
+ blockChain := testutil .SetupBlockChain (ctx , t , persistence , 100 , 10 )
124
+ traverser := TraversalBuilder {
125
+ Root : blockChain .TipLink ,
126
+ Selector : blockChain .Selector (),
127
+ Chooser : blockChain .Chooser ,
128
+ LinkSystem : persistence ,
129
+ Visitor : func (tp traversal.Progress , node ipld.Node , r traversal.VisitReason ) error {
130
+ return nil
131
+ },
132
+ Budget : & traversal.Budget {
133
+ NodeBudget : math .MaxInt64 ,
134
+ LinkBudget : 0 ,
135
+ },
136
+ }.Start (ctx )
137
+ checkTraverseSequence (ctx , t , traverser , []blocks.Block {}, & traversal.ErrBudgetExceeded {BudgetKind : "link" , Link : blockChain .TipLink })
138
+ })
93
139
}
94
140
95
- func checkTraverseSequence (ctx context.Context , t * testing.T , traverser Traverser , expectedBlks []blocks.Block ) {
141
+ func checkTraverseSequence (ctx context.Context , t * testing.T , traverser Traverser , expectedBlks []blocks.Block , finalErr error ) {
96
142
for _ , blk := range expectedBlks {
97
143
isComplete , err := traverser .IsComplete ()
98
144
require .False (t , isComplete )
@@ -104,5 +150,9 @@ func checkTraverseSequence(ctx context.Context, t *testing.T, traverser Traverse
104
150
}
105
151
isComplete , err := traverser .IsComplete ()
106
152
require .True (t , isComplete )
107
- require .NoError (t , err )
153
+ if finalErr == nil {
154
+ require .NoError (t , err )
155
+ } else {
156
+ require .EqualError (t , err , finalErr .Error ())
157
+ }
108
158
}
0 commit comments