package types
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/tendermint/tendermint/config"
|
|
"github.com/tendermint/tendermint/crypto/tmhash"
|
|
"github.com/tendermint/tendermint/internal/test/factory"
|
|
tmrand "github.com/tendermint/tendermint/libs/rand"
|
|
tmtime "github.com/tendermint/tendermint/libs/time"
|
|
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
func TestPeerCatchupRounds(t *testing.T) {
|
|
cfg, err := config.ResetTestRoot(t.TempDir(), "consensus_height_vote_set_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
valSet, privVals := factory.ValidatorSet(ctx, t, 10, 1)
|
|
|
|
chainID := cfg.ChainID()
|
|
hvs := NewHeightVoteSet(chainID, 1, valSet)
|
|
|
|
vote999_0 := makeVoteHR(ctx, t, 1, 0, 999, privVals, chainID)
|
|
added, err := hvs.AddVote(vote999_0, "peer1")
|
|
if !added || err != nil {
|
|
t.Error("Expected to successfully add vote from peer", added, err)
|
|
}
|
|
|
|
vote1000_0 := makeVoteHR(ctx, t, 1, 0, 1000, privVals, chainID)
|
|
added, err = hvs.AddVote(vote1000_0, "peer1")
|
|
if !added || err != nil {
|
|
t.Error("Expected to successfully add vote from peer", added, err)
|
|
}
|
|
|
|
vote1001_0 := makeVoteHR(ctx, t, 1, 0, 1001, privVals, chainID)
|
|
added, err = hvs.AddVote(vote1001_0, "peer1")
|
|
if err != ErrGotVoteFromUnwantedRound {
|
|
t.Errorf("expected GotVoteFromUnwantedRoundError, but got %v", err)
|
|
}
|
|
if added {
|
|
t.Error("Expected to *not* add vote from peer, too many catchup rounds.")
|
|
}
|
|
|
|
added, err = hvs.AddVote(vote1001_0, "peer2")
|
|
if !added || err != nil {
|
|
t.Error("Expected to successfully add vote from another peer")
|
|
}
|
|
|
|
}
|
|
|
|
func makeVoteHR(
|
|
ctx context.Context,
|
|
t *testing.T,
|
|
height int64,
|
|
valIndex, round int32,
|
|
privVals []types.PrivValidator,
|
|
chainID string,
|
|
) *types.Vote {
|
|
t.Helper()
|
|
|
|
privVal := privVals[valIndex]
|
|
pubKey, err := privVal.GetPubKey(ctx)
|
|
require.NoError(t, err)
|
|
|
|
randBytes := tmrand.Bytes(tmhash.Size)
|
|
|
|
vote := &types.Vote{
|
|
ValidatorAddress: pubKey.Address(),
|
|
ValidatorIndex: valIndex,
|
|
Height: height,
|
|
Round: round,
|
|
Timestamp: tmtime.Now(),
|
|
Type: tmproto.PrecommitType,
|
|
BlockID: types.BlockID{Hash: randBytes, PartSetHeader: types.PartSetHeader{}},
|
|
}
|
|
|
|
v := vote.ToProto()
|
|
err = privVal.SignVote(ctx, chainID, v)
|
|
require.NoError(t, err, "Error signing vote")
|
|
|
|
vote.Signature = v.Signature
|
|
|
|
return vote
|
|
}
|