package types import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" crypto "github.com/tendermint/go-crypto" cmn "github.com/tendermint/tmlibs/common" ) func TestValidateBlock(t *testing.T) { txs := []Tx{Tx("foo"), Tx("bar")} lastID := makeBlockIDRandom() h := int64(3) voteSet, _, vals := randVoteSet(h-1, 1, VoteTypePrecommit, 10, 1) commit, err := MakeCommit(lastID, h-1, 1, voteSet, vals) require.NoError(t, err) block := MakeBlock(h, txs, commit) require.NotNil(t, block) // proper block must pass err = block.ValidateBasic() require.NoError(t, err) // tamper with NumTxs block = MakeBlock(h, txs, commit) block.NumTxs += 1 err = block.ValidateBasic() require.Error(t, err) // remove 1/2 the commits block = MakeBlock(h, txs, commit) block.LastCommit.Precommits = commit.Precommits[:commit.Size()/2] block.LastCommit.hash = nil // clear hash or change wont be noticed err = block.ValidateBasic() require.Error(t, err) // tamper with LastCommitHash block = MakeBlock(h, txs, commit) block.LastCommitHash = []byte("something else") err = block.ValidateBasic() require.Error(t, err) // tamper with data block = MakeBlock(h, txs, commit) block.Data.Txs[0] = Tx("something else") block.Data.hash = nil // clear hash or change wont be noticed err = block.ValidateBasic() require.Error(t, err) // tamper with DataHash block = MakeBlock(h, txs, commit) block.DataHash = cmn.RandBytes(len(block.DataHash)) err = block.ValidateBasic() require.Error(t, err) } func makeBlockIDRandom() BlockID { blockHash, blockPartsHeader := crypto.CRandBytes(32), PartSetHeader{123, crypto.CRandBytes(32)} return BlockID{blockHash, blockPartsHeader} } func makeBlockID(hash string, partSetSize int, partSetHash string) BlockID { return BlockID{ Hash: []byte(hash), PartsHeader: PartSetHeader{ Total: partSetSize, Hash: []byte(partSetHash), }, } } var nilBytes []byte func TestNilHeaderHashDoesntCrash(t *testing.T) { assert.Equal(t, []byte((*Header)(nil).Hash()), nilBytes) assert.Equal(t, []byte((new(Header)).Hash()), nilBytes) } func TestNilDataHashDoesntCrash(t *testing.T) { assert.Equal(t, []byte((*Data)(nil).Hash()), nilBytes) assert.Equal(t, []byte(new(Data).Hash()), nilBytes) }