github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/fvm/environment/blocks_test.go (about) 1 package environment 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 8 "github.com/onflow/flow-go/model/flow" 9 "github.com/onflow/flow-go/storage" 10 storageMock "github.com/onflow/flow-go/storage/mock" 11 "github.com/onflow/flow-go/utils/unittest" 12 ) 13 14 func doTest(t *testing.T, f func(*testing.T, *storageMock.Headers, Blocks, *flow.Header)) func(*testing.T) { 15 return func(t *testing.T) { 16 17 headers := new(storageMock.Headers) 18 blockFinder := NewBlockFinder(headers) 19 header := unittest.BlockHeaderFixture() 20 header.Height = 10 21 22 f(t, headers, blockFinder, header) 23 24 headers.AssertExpectations(t) 25 } 26 } 27 28 func Test_BlockFinder_ReturnsHeaderIfSameHeight(t *testing.T) { 29 30 t.Run("returns header is height is the same", doTest(t, func(t *testing.T, headers *storageMock.Headers, blockFinder Blocks, header *flow.Header) { 31 heightFrom, err := blockFinder.ByHeightFrom(10, header) 32 require.NoError(t, err) 33 require.Equal(t, *header, *heightFrom) 34 })) 35 36 t.Run("nil header defaults to ByHeight", doTest(t, func(t *testing.T, headers *storageMock.Headers, blockFinder Blocks, header *flow.Header) { 37 38 headers.On("ByHeight", uint64(10)).Return(header, nil) 39 40 heightFrom, err := blockFinder.ByHeightFrom(10, nil) 41 require.NoError(t, err) 42 require.Equal(t, *header, *heightFrom) 43 })) 44 45 t.Run("follows blocks chain", doTest(t, func(t *testing.T, headers *storageMock.Headers, blockFinder Blocks, header *flow.Header) { 46 47 header0 := unittest.BlockHeaderFixture() 48 header0.Height = 0 49 header1 := unittest.BlockHeaderWithParentFixture(header0) 50 header2 := unittest.BlockHeaderWithParentFixture(header1) 51 header3 := unittest.BlockHeaderWithParentFixture(header2) 52 header4 := unittest.BlockHeaderWithParentFixture(header3) 53 header5 := unittest.BlockHeaderWithParentFixture(header4) 54 55 headers.On("ByBlockID", header4.ID()).Return(header4, nil) 56 headers.On("ByHeight", uint64(4)).Return(nil, storage.ErrNotFound) 57 headers.On("ByBlockID", header3.ID()).Return(header3, nil) 58 headers.On("ByHeight", uint64(3)).Return(nil, storage.ErrNotFound) 59 headers.On("ByBlockID", header2.ID()).Return(header2, nil) 60 headers.On("ByHeight", uint64(2)).Return(nil, storage.ErrNotFound) 61 headers.On("ByBlockID", header1.ID()).Return(header1, nil) 62 headers.On("ByHeight", uint64(1)).Return(nil, storage.ErrNotFound) 63 headers.On("ByBlockID", header0.ID()).Return(header0, nil) 64 //headers.On("ByHeight", uint64(0)).Return(nil, storage.ErrNotFound) 65 66 heightFrom, err := blockFinder.ByHeightFrom(0, header5) 67 require.NoError(t, err) 68 require.Equal(t, *header0, *heightFrom) 69 })) 70 71 t.Run("skips heights once it get to finalized chain", doTest(t, func(t *testing.T, headers *storageMock.Headers, blockFinder Blocks, header *flow.Header) { 72 73 header0 := unittest.BlockHeaderFixture() 74 header0.Height = 0 75 header1 := unittest.BlockHeaderWithParentFixture(header0) 76 header2 := unittest.BlockHeaderWithParentFixture(header1) 77 header3 := unittest.BlockHeaderWithParentFixture(header2) 78 header4 := unittest.BlockHeaderWithParentFixture(header3) 79 header5 := unittest.BlockHeaderWithParentFixture(header4) 80 81 headers.On("ByBlockID", header4.ID()).Return(header4, nil) 82 headers.On("ByHeight", uint64(4)).Return(nil, storage.ErrNotFound) 83 headers.On("ByBlockID", header3.ID()).Return(header3, nil) 84 headers.On("ByHeight", uint64(3)).Return(header3, nil) 85 headers.On("ByHeight", uint64(0)).Return(header0, nil) 86 87 heightFrom, err := blockFinder.ByHeightFrom(0, header5) 88 require.NoError(t, err) 89 require.Equal(t, *header0, *heightFrom) 90 })) 91 92 }