package e2e_test import ( "context" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" e2e "github.com/tendermint/tendermint/test/e2e/pkg" ) // Tests that block headers are identical across nodes where present. func TestBlock_Header(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() blocks := fetchBlockChain(ctx, t) testNode(t, func(ctx context.Context, t *testing.T, node e2e.Node) { client, err := node.Client() require.NoError(t, err) status, err := client.Status(ctx) require.NoError(t, err) first := status.SyncInfo.EarliestBlockHeight last := status.SyncInfo.LatestBlockHeight if node.RetainBlocks > 0 { first++ // avoid race conditions with block pruning } for _, block := range blocks { if block.Header.Height < first { continue } // the first blocks after state sync come from the backfill process // and are therefore not complete if node.StateSync != e2e.StateSyncDisabled && block.Header.Height <= first+e2e.EvidenceAgeHeight+1 { continue } if block.Header.Height > last { break } resp, err := client.Block(ctx, &block.Header.Height) require.NoError(t, err) require.Equal(t, block, resp.Block, "block mismatch for height %d", block.Header.Height) require.NoError(t, resp.Block.ValidateBasic(), "block at height %d is invalid", block.Header.Height) } }) } // Tests that the node contains the expected block range. func TestBlock_Range(t *testing.T) { testNode(t, func(ctx context.Context, t *testing.T, node e2e.Node) { client, err := node.Client() require.NoError(t, err) status, err := client.Status(ctx) require.NoError(t, err) first := status.SyncInfo.EarliestBlockHeight last := status.SyncInfo.LatestBlockHeight switch { // if the node state synced we ignore any assertions because it's hard to know how far back // the node ran reverse sync for case node.StateSync != e2e.StateSyncDisabled: break case node.RetainBlocks > 0 && int64(node.RetainBlocks) < (last-node.Testnet.InitialHeight+1): // Delta handles race conditions in reading first/last heights. assert.InDelta(t, node.RetainBlocks, last-first+1, 1, "node not pruning expected blocks") default: assert.Equal(t, node.Testnet.InitialHeight, first, "node's first block should be network's initial height") } for h := first; h <= last; h++ { if node.StateSync != e2e.StateSyncDisabled && h <= first+e2e.EvidenceAgeHeight+1 { continue } resp, err := client.Block(ctx, &(h)) if err != nil && node.RetainBlocks > 0 && h == first { // Ignore errors in first block if node is pruning blocks due to race conditions. continue } require.NoError(t, err) require.NotNil(t, resp.Block) assert.Equal(t, h, resp.Block.Height) } for h := node.Testnet.InitialHeight; h < first; h++ { _, err := client.Block(ctx, &(h)) require.Error(t, err) } }) }