@@ -125,3 +125,96 @@ func TestVerify(t *testing.T) {
125
125
})
126
126
}
127
127
}
128
+
129
+ func TestVerifyRange (t * testing.T ) {
130
+ tests := []struct {
131
+ name string
132
+ setup func (* DummySuite ) (* DummyHeader , []* DummyHeader )
133
+ err error
134
+ verified int // number of headers that should be verified before error
135
+ }{
136
+ {
137
+ name : "successful verification of all headers" ,
138
+ setup : func (suite * DummySuite ) (* DummyHeader , []* DummyHeader ) {
139
+ trusted := suite .GenDummyHeaders (1 )[0 ]
140
+ untrstd := suite .GenDummyHeaders (5 )
141
+ return trusted , untrstd
142
+ },
143
+ verified : 5 ,
144
+ },
145
+ {
146
+ name : "empty untrusted headers range" ,
147
+ setup : func (suite * DummySuite ) (* DummyHeader , []* DummyHeader ) {
148
+ trusted := suite .GenDummyHeaders (1 )[0 ]
149
+ return trusted , []* DummyHeader {}
150
+ },
151
+ err : header .ErrEmptyRange ,
152
+ },
153
+ {
154
+ name : "zero trusted header" ,
155
+ setup : func (suite * DummySuite ) (* DummyHeader , []* DummyHeader ) {
156
+ var zero * DummyHeader
157
+ return zero , []* DummyHeader {zero }
158
+ },
159
+ err : header .ErrZeroHeader ,
160
+ },
161
+ {
162
+ name : "zero untrusted header" ,
163
+ setup : func (suite * DummySuite ) (* DummyHeader , []* DummyHeader ) {
164
+ var zero * DummyHeader
165
+ return zero , []* DummyHeader {zero }
166
+ },
167
+ err : header .ErrZeroHeader ,
168
+ },
169
+ {
170
+ name : "verification fails in middle of range" ,
171
+ setup : func (suite * DummySuite ) (* DummyHeader , []* DummyHeader ) {
172
+ trusted := suite .GenDummyHeaders (1 )[0 ]
173
+ headers := suite .GenDummyHeaders (5 )
174
+ headers [2 ].VerifyFailure = true // make 3rd header fail verification
175
+ return trusted , headers
176
+ },
177
+ err : ErrDummyVerify ,
178
+ verified : 2 ,
179
+ },
180
+ {
181
+ name : "non-adjacent header range " ,
182
+ setup : func (suite * DummySuite ) (* DummyHeader , []* DummyHeader ) {
183
+ trusted := suite .GenDummyHeaders (1 )[0 ]
184
+ _ = suite .GenDummyHeaders (
185
+ 1 ,
186
+ ) // generate a header to ensure the range can be non-adjacent
187
+ headers := suite .GenDummyHeaders (3 )
188
+ headers = append (headers [0 :1 ], headers [2 :]... )
189
+ return trusted , headers
190
+ },
191
+ err : header .ErrNonAdjacentRange ,
192
+ verified : 1 ,
193
+ },
194
+ }
195
+
196
+ for _ , tt := range tests {
197
+ t .Run (tt .name , func (t * testing.T ) {
198
+ suite := NewTestSuite (t )
199
+ trusted , untrstd := tt .setup (suite )
200
+ verified , err := header .VerifyRange (trusted , untrstd )
201
+
202
+ if tt .err != nil {
203
+ var verErr * header.VerifyError
204
+ assert .ErrorAs (t , err , & verErr )
205
+ assert .ErrorIs (t , errors .Unwrap (verErr ), tt .err )
206
+ assert .Len (t , verified , tt .verified )
207
+ } else {
208
+ assert .NoError (t , err )
209
+ assert .Len (t , verified , len (untrstd ))
210
+ if len (untrstd ) > 0 {
211
+ assert .Equal (t ,
212
+ untrstd [len (untrstd )- 1 ],
213
+ verified [len (verified )- 1 ],
214
+ "last verified header should match last input header" ,
215
+ )
216
+ }
217
+ }
218
+ })
219
+ }
220
+ }
0 commit comments