@@ -1510,6 +1510,7 @@ mod tests {
15101510 run_test ( test_genesis_block, engine_type) . await ;
15111511 run_test ( test_iter_accounts, engine_type) . await ;
15121512 run_test ( test_iter_storage, engine_type) . await ;
1513+ run_test ( test_get_block_headers_and_bodies_bulk, engine_type) . await ;
15131514 }
15141515
15151516 async fn test_iter_accounts ( store : Store ) {
@@ -1634,6 +1635,68 @@ mod tests {
16341635 assert_eq ! ( stored_body, block_body) ;
16351636 }
16361637
1638+ async fn test_get_block_headers_and_bodies_bulk ( store : Store ) {
1639+ // Create and store multiple blocks
1640+ let mut headers = Vec :: new ( ) ;
1641+ let mut bodies = Vec :: new ( ) ;
1642+
1643+ for i in 0 ..5u64 {
1644+ let ( mut header, body) = create_block_for_testing ( ) ;
1645+ header. number = i;
1646+ // Make them unique by modifying the timestamp
1647+ header. timestamp = 1000 + i;
1648+ let hash = header. hash ( ) ;
1649+
1650+ store. add_block_header ( hash, header. clone ( ) ) . await . unwrap ( ) ;
1651+ store. add_block_body ( hash, body. clone ( ) ) . await . unwrap ( ) ;
1652+ store
1653+ . forkchoice_update ( None , i, hash, None , None )
1654+ . await
1655+ . unwrap ( ) ;
1656+
1657+ headers. push ( header) ;
1658+ bodies. push ( body) ;
1659+ }
1660+
1661+ // Test bulk fetch of headers
1662+ let fetched_headers = store. get_block_headers ( 0 , 4 ) . await . unwrap ( ) ;
1663+ assert_eq ! ( fetched_headers. len( ) , 5 ) ;
1664+ for ( i, fetched) in fetched_headers. into_iter ( ) . enumerate ( ) {
1665+ let fetched = fetched. expect ( "header should exist" ) ;
1666+ // Ensure hashes are computed for comparison
1667+ let _ = fetched. hash ( ) ;
1668+ let _ = headers[ i] . hash ( ) ;
1669+ assert_eq ! ( fetched, headers[ i] ) ;
1670+ }
1671+
1672+ // Test bulk fetch of bodies
1673+ let fetched_bodies = store. get_block_bodies ( 0 , 4 ) . await . unwrap ( ) ;
1674+ assert_eq ! ( fetched_bodies. len( ) , 5 ) ;
1675+ for ( i, fetched) in fetched_bodies. into_iter ( ) . enumerate ( ) {
1676+ let fetched = fetched. expect ( "body should exist" ) ;
1677+ assert_eq ! ( fetched, bodies[ i] ) ;
1678+ }
1679+
1680+ // Test partial range
1681+ let partial_headers = store. get_block_headers ( 2 , 4 ) . await . unwrap ( ) ;
1682+ assert_eq ! ( partial_headers. len( ) , 3 ) ;
1683+ for ( i, fetched) in partial_headers. into_iter ( ) . enumerate ( ) {
1684+ let fetched = fetched. expect ( "header should exist" ) ;
1685+ let _ = fetched. hash ( ) ;
1686+ let _ = headers[ i + 2 ] . hash ( ) ;
1687+ assert_eq ! ( fetched, headers[ i + 2 ] ) ;
1688+ }
1689+
1690+ // Test range with missing blocks (beyond stored range)
1691+ let extended_headers = store. get_block_headers ( 3 , 7 ) . await . unwrap ( ) ;
1692+ assert_eq ! ( extended_headers. len( ) , 5 ) ;
1693+ assert ! ( extended_headers[ 0 ] . is_some( ) ) ;
1694+ assert ! ( extended_headers[ 1 ] . is_some( ) ) ;
1695+ assert ! ( extended_headers[ 2 ] . is_none( ) ) ;
1696+ assert ! ( extended_headers[ 3 ] . is_none( ) ) ;
1697+ assert ! ( extended_headers[ 4 ] . is_none( ) ) ;
1698+ }
1699+
16371700 fn create_block_for_testing ( ) -> ( BlockHeader , BlockBody ) {
16381701 let block_header = BlockHeader {
16391702 parent_hash : H256 :: from_str (
0 commit comments