package e2e_test
|
|
|
|
import (
|
|
"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) {
|
|
blocks := fetchBlockChain(t)
|
|
testNode(t, func(t *testing.T, node e2e.Node) {
|
|
if node.Mode == e2e.ModeSeed {
|
|
return
|
|
}
|
|
|
|
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 && 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(t *testing.T, node e2e.Node) {
|
|
if node.Mode == e2e.ModeSeed {
|
|
return
|
|
}
|
|
|
|
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:
|
|
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 && 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)
|
|
}
|
|
})
|
|
}
|