@@ -73,7 +73,14 @@ func runPendingBase_GetPending_AllCases[T any](t *testing.T, tc pendingBaseTestC
7373 assert .Len (t , pending , 2 )
7474 // Use reflection to call Height() for both types
7575 getHeight := func (item any ) uint64 {
76- return item .(interface { Height () uint64 }).Height ()
76+ switch v := item .(type ) {
77+ case * types.Data :
78+ return v .Height ()
79+ case * types.SignedHeader :
80+ return v .Height ()
81+ default :
82+ panic ("unexpected type" )
83+ }
7784 }
7885 assert .Equal (t , uint64 (3 ), getHeight (pending [0 ]))
7986 assert .Equal (t , uint64 (4 ), getHeight (pending [1 ]))
@@ -136,79 +143,52 @@ func runPendingBase_setLastSubmittedHeight[T any](t *testing.T, tc pendingBaseTe
136143 })
137144}
138145
139- func runPendingBase_init_with_existing_metadata [T any ](t * testing.T , tc pendingBaseTestCase [T ]) {
140- t .Run (tc .name + "/init_with_existing_metadata" , func (t * testing.T ) {
141- mockStore := mocksStore .NewStore (t )
142- logger := log .NewNopLogger ()
143- val := make ([]byte , 8 )
144- binary .LittleEndian .PutUint64 (val , 7 )
145- mockStore .On ("GetMetadata" , mock .Anything , tc .key ).Return (val , nil ).Once ()
146- pb := & pendingBase [T ]{store : mockStore , logger : logger , metaKey : tc .key , fetch : tc .fetch }
147- err := pb .init ()
148- assert .NoError (t , err )
149- assert .Equal (t , uint64 (7 ), pb .lastHeight .Load ())
150- })
151- }
152-
153- func runPendingBase_init_invalid_length [T any ](t * testing.T , tc pendingBaseTestCase [T ]) {
154- t .Run (tc .name + "/init_invalid_length" , func (t * testing.T ) {
155- mockStore := mocksStore .NewStore (t )
156- logger := log .NewNopLogger ()
157- mockStore .On ("GetMetadata" , mock .Anything , tc .key ).Return ([]byte {1 , 2 }, nil ).Once ()
158- pb := & pendingBase [T ]{store : mockStore , logger : logger , metaKey : tc .key , fetch : tc .fetch }
159- err := pb .init ()
160- assert .Error (t , err )
161- })
162- }
163-
164- func runPendingBase_isEmpty_and_init [T any ](t * testing.T , tc pendingBaseTestCase [T ]) {
165- t .Run (tc .name + "/isEmpty" , func (t * testing.T ) {
166- mockStore := mocksStore .NewStore (t )
167- logger := log .NewNopLogger ()
168- mockStore .On ("GetMetadata" , mock .Anything , tc .key ).Return (nil , ds .ErrNotFound ).Once ()
169- pb , err := newPendingBase (mockStore , logger , tc .key , tc .fetch )
170- require .NoError (t , err )
171-
172- // isEmpty true
173- pb .lastHeight .Store (10 )
174- mockStore .On ("Height" , mock .Anything ).Return (uint64 (10 ), nil ).Once ()
175- assert .True (t , pb .isEmpty ())
176-
177- // isEmpty false
178- pb .lastHeight .Store (5 )
179- mockStore .On ("Height" , mock .Anything ).Return (uint64 (10 ), nil ).Once ()
180- assert .False (t , pb .isEmpty ())
181- })
182-
183- t .Run (tc .name + "/init_missing_metadata" , func (t * testing.T ) {
184- mockStore := mocksStore .NewStore (t )
185- logger := log .NewNopLogger ()
186- mockStore .On ("GetMetadata" , mock .Anything , tc .key ).Return (nil , ds .ErrNotFound ).Once ()
187- pb := & pendingBase [T ]{store : mockStore , logger : logger , metaKey : tc .key , fetch : tc .fetch }
188- err := pb .init ()
189- assert .NoError (t , err )
190- assert .Equal (t , uint64 (0 ), pb .lastHeight .Load ())
191- })
192-
193- t .Run (tc .name + "/init_valid_metadata" , func (t * testing.T ) {
194- mockStore := mocksStore .NewStore (t )
195- logger := log .NewNopLogger ()
196- val := make ([]byte , 8 )
197- binary .LittleEndian .PutUint64 (val , 7 )
198- mockStore .On ("GetMetadata" , mock .Anything , tc .key ).Return (val , nil ).Once ()
199- pb := & pendingBase [T ]{store : mockStore , logger : logger , metaKey : tc .key , fetch : tc .fetch }
200- err := pb .init ()
201- assert .NoError (t , err )
202- assert .Equal (t , uint64 (7 ), pb .lastHeight .Load ())
203- })
204-
205- t .Run (tc .name + "/init_invalid_metadata_length" , func (t * testing.T ) {
206- mockStore := mocksStore .NewStore (t )
207- logger := log .NewNopLogger ()
208- mockStore .On ("GetMetadata" , mock .Anything , tc .key ).Return ([]byte {1 , 2 }, nil ).Once ()
209- pb := & pendingBase [T ]{store : mockStore , logger : logger , metaKey : tc .key , fetch : tc .fetch }
210- err := pb .init ()
211- assert .Error (t , err )
146+ func runPendingBase_init_cases [T any ](t * testing.T , tc pendingBaseTestCase [T ]) {
147+ t .Run (tc .name + "/init_cases" , func (t * testing.T ) {
148+ cases := []struct {
149+ name string
150+ metaValue []byte
151+ metaErr error
152+ expectErr bool
153+ expectVal uint64
154+ }{
155+ {
156+ name : "missing_metadata" ,
157+ metaValue : nil ,
158+ metaErr : ds .ErrNotFound ,
159+ expectErr : false ,
160+ expectVal : 0 ,
161+ },
162+ {
163+ name : "valid_metadata" ,
164+ metaValue : func () []byte { v := make ([]byte , 8 ); binary .LittleEndian .PutUint64 (v , 7 ); return v }(),
165+ metaErr : nil ,
166+ expectErr : false ,
167+ expectVal : 7 ,
168+ },
169+ {
170+ name : "invalid_metadata_length" ,
171+ metaValue : []byte {1 , 2 },
172+ metaErr : nil ,
173+ expectErr : true ,
174+ expectVal : 0 ,
175+ },
176+ }
177+ for _ , c := range cases {
178+ t .Run (c .name , func (t * testing.T ) {
179+ mockStore := mocksStore .NewStore (t )
180+ logger := log .NewNopLogger ()
181+ mockStore .On ("GetMetadata" , mock .Anything , tc .key ).Return (c .metaValue , c .metaErr ).Once ()
182+ pb := & pendingBase [T ]{store : mockStore , logger : logger , metaKey : tc .key , fetch : tc .fetch }
183+ err := pb .init ()
184+ if c .expectErr {
185+ assert .Error (t , err )
186+ } else {
187+ assert .NoError (t , err )
188+ assert .Equal (t , c .expectVal , pb .lastHeight .Load ())
189+ }
190+ })
191+ }
212192 })
213193}
214194
@@ -293,19 +273,15 @@ func TestPendingBase_Generic(t *testing.T) {
293273 runPendingBase_GetPending_AllCases (t , tc )
294274 runPendingBase_isEmpty_numPending (t , tc )
295275 runPendingBase_setLastSubmittedHeight (t , tc )
296- runPendingBase_init_with_existing_metadata (t , tc )
297- runPendingBase_init_invalid_length (t , tc )
298- runPendingBase_isEmpty_and_init (t , tc )
276+ runPendingBase_init_cases (t , tc )
299277 runPendingBase_Fetch (t , tc )
300278 runPendingBase_NewPending (t , tc , func (store store.Store , logger log.Logger ) (any , error ) { return NewPendingData (store , logger ) })
301279 case pendingBaseTestCase [* types.SignedHeader ]:
302280 runPendingBase_InitAndGetLastSubmittedHeight (t , tc )
303281 runPendingBase_GetPending_AllCases (t , tc )
304282 runPendingBase_isEmpty_numPending (t , tc )
305283 runPendingBase_setLastSubmittedHeight (t , tc )
306- runPendingBase_init_with_existing_metadata (t , tc )
307- runPendingBase_init_invalid_length (t , tc )
308- runPendingBase_isEmpty_and_init (t , tc )
284+ runPendingBase_init_cases (t , tc )
309285 runPendingBase_Fetch (t , tc )
310286 runPendingBase_NewPending (t , tc , func (store store.Store , logger log.Logger ) (any , error ) { return NewPendingHeaders (store , logger ) })
311287 }
0 commit comments