mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-30 03:35:34 +00:00
consensus: reduce shared state in tests (#6313)
This commit is contained in:
@@ -28,7 +28,7 @@ import (
|
|||||||
// Byzantine node sends two different prevotes (nil and blockID) to the same
|
// Byzantine node sends two different prevotes (nil and blockID) to the same
|
||||||
// validator.
|
// validator.
|
||||||
func TestByzantinePrevoteEquivocation(t *testing.T) {
|
func TestByzantinePrevoteEquivocation(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
nValidators := 4
|
nValidators := 4
|
||||||
prevoteHeight := int64(2)
|
prevoteHeight := int64(2)
|
||||||
@@ -36,7 +36,7 @@ func TestByzantinePrevoteEquivocation(t *testing.T) {
|
|||||||
tickerFunc := newMockTickerFunc(true)
|
tickerFunc := newMockTickerFunc(true)
|
||||||
appFunc := newCounter
|
appFunc := newCounter
|
||||||
|
|
||||||
genDoc, privVals := randGenesisDoc(nValidators, false, 30)
|
genDoc, privVals := randGenesisDoc(config, nValidators, false, 30)
|
||||||
states := make([]*State, nValidators)
|
states := make([]*State, nValidators)
|
||||||
|
|
||||||
for i := 0; i < nValidators; i++ {
|
for i := 0; i < nValidators; i++ {
|
||||||
|
|||||||
+42
-22
@@ -42,24 +42,21 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
testSubscriber = "test-client"
|
testSubscriber = "test-client"
|
||||||
|
|
||||||
|
// genesis, chain_id, priv_val
|
||||||
|
ensureTimeout = time.Millisecond * 200
|
||||||
)
|
)
|
||||||
|
|
||||||
// A cleanupFunc cleans up any config / test files created for a particular
|
// A cleanupFunc cleans up any config / test files created for a particular
|
||||||
// test.
|
// test.
|
||||||
type cleanupFunc func()
|
type cleanupFunc func()
|
||||||
|
|
||||||
// genesis, chain_id, priv_val
|
func configSetup(t *testing.T) *cfg.Config {
|
||||||
var (
|
|
||||||
config *cfg.Config // NOTE: must be reset for each _test.go file
|
|
||||||
consensusReplayConfig *cfg.Config
|
|
||||||
ensureTimeout = time.Millisecond * 200
|
|
||||||
)
|
|
||||||
|
|
||||||
func configSetup(t *testing.T) {
|
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
config = ResetConfig("consensus_reactor_test")
|
config := ResetConfig("consensus_reactor_test")
|
||||||
consensusReplayConfig = ResetConfig("consensus_replay_test")
|
|
||||||
|
consensusReplayConfig := ResetConfig("consensus_replay_test")
|
||||||
configStateTest := ResetConfig("consensus_state_test")
|
configStateTest := ResetConfig("consensus_state_test")
|
||||||
configMempoolTest := ResetConfig("consensus_mempool_test")
|
configMempoolTest := ResetConfig("consensus_mempool_test")
|
||||||
configByzantineTest := ResetConfig("consensus_byzantine_test")
|
configByzantineTest := ResetConfig("consensus_byzantine_test")
|
||||||
@@ -71,6 +68,7 @@ func configSetup(t *testing.T) {
|
|||||||
os.RemoveAll(configMempoolTest.RootDir)
|
os.RemoveAll(configMempoolTest.RootDir)
|
||||||
os.RemoveAll(configByzantineTest.RootDir)
|
os.RemoveAll(configByzantineTest.RootDir)
|
||||||
})
|
})
|
||||||
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
func ensureDir(dir string, mode os.FileMode) {
|
func ensureDir(dir string, mode os.FileMode) {
|
||||||
@@ -94,7 +92,7 @@ type validatorStub struct {
|
|||||||
VotingPower int64
|
VotingPower int64
|
||||||
}
|
}
|
||||||
|
|
||||||
var testMinPower int64 = 10
|
const testMinPower int64 = 10
|
||||||
|
|
||||||
func newValidatorStub(privValidator types.PrivValidator, valIndex int32) *validatorStub {
|
func newValidatorStub(privValidator types.PrivValidator, valIndex int32) *validatorStub {
|
||||||
return &validatorStub{
|
return &validatorStub{
|
||||||
@@ -105,6 +103,7 @@ func newValidatorStub(privValidator types.PrivValidator, valIndex int32) *valida
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (vs *validatorStub) signVote(
|
func (vs *validatorStub) signVote(
|
||||||
|
config *cfg.Config,
|
||||||
voteType tmproto.SignedMsgType,
|
voteType tmproto.SignedMsgType,
|
||||||
hash []byte,
|
hash []byte,
|
||||||
header types.PartSetHeader) (*types.Vote, error) {
|
header types.PartSetHeader) (*types.Vote, error) {
|
||||||
@@ -131,8 +130,14 @@ func (vs *validatorStub) signVote(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sign vote for type/hash/header
|
// Sign vote for type/hash/header
|
||||||
func signVote(vs *validatorStub, voteType tmproto.SignedMsgType, hash []byte, header types.PartSetHeader) *types.Vote {
|
func signVote(
|
||||||
v, err := vs.signVote(voteType, hash, header)
|
vs *validatorStub,
|
||||||
|
config *cfg.Config,
|
||||||
|
voteType tmproto.SignedMsgType,
|
||||||
|
hash []byte,
|
||||||
|
header types.PartSetHeader) *types.Vote {
|
||||||
|
|
||||||
|
v, err := vs.signVote(config, voteType, hash, header)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("failed to sign vote: %v", err))
|
panic(fmt.Errorf("failed to sign vote: %v", err))
|
||||||
}
|
}
|
||||||
@@ -140,13 +145,14 @@ func signVote(vs *validatorStub, voteType tmproto.SignedMsgType, hash []byte, he
|
|||||||
}
|
}
|
||||||
|
|
||||||
func signVotes(
|
func signVotes(
|
||||||
|
config *cfg.Config,
|
||||||
voteType tmproto.SignedMsgType,
|
voteType tmproto.SignedMsgType,
|
||||||
hash []byte,
|
hash []byte,
|
||||||
header types.PartSetHeader,
|
header types.PartSetHeader,
|
||||||
vss ...*validatorStub) []*types.Vote {
|
vss ...*validatorStub) []*types.Vote {
|
||||||
votes := make([]*types.Vote, len(vss))
|
votes := make([]*types.Vote, len(vss))
|
||||||
for i, vs := range vss {
|
for i, vs := range vss {
|
||||||
votes[i] = signVote(vs, voteType, hash, header)
|
votes[i] = signVote(vs, config, voteType, hash, header)
|
||||||
}
|
}
|
||||||
return votes
|
return votes
|
||||||
}
|
}
|
||||||
@@ -237,13 +243,14 @@ func addVotes(to *State, votes ...*types.Vote) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func signAddVotes(
|
func signAddVotes(
|
||||||
|
config *cfg.Config,
|
||||||
to *State,
|
to *State,
|
||||||
voteType tmproto.SignedMsgType,
|
voteType tmproto.SignedMsgType,
|
||||||
hash []byte,
|
hash []byte,
|
||||||
header types.PartSetHeader,
|
header types.PartSetHeader,
|
||||||
vss ...*validatorStub,
|
vss ...*validatorStub,
|
||||||
) {
|
) {
|
||||||
votes := signVotes(voteType, hash, header, vss...)
|
votes := signVotes(config, voteType, hash, header, vss...)
|
||||||
addVotes(to, votes...)
|
addVotes(to, votes...)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,9 +447,9 @@ func loadPrivValidator(config *cfg.Config) *privval.FilePV {
|
|||||||
return privValidator
|
return privValidator
|
||||||
}
|
}
|
||||||
|
|
||||||
func randState(nValidators int) (*State, []*validatorStub) {
|
func randState(config *cfg.Config, nValidators int) (*State, []*validatorStub) {
|
||||||
// Get State
|
// Get State
|
||||||
state, privVals := randGenesisState(nValidators, false, 10)
|
state, privVals := randGenesisState(config, nValidators, false, 10)
|
||||||
|
|
||||||
vss := make([]*validatorStub, nValidators)
|
vss := make([]*validatorStub, nValidators)
|
||||||
|
|
||||||
@@ -694,6 +701,7 @@ func consensusLogger() log.Logger {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func randConsensusState(
|
func randConsensusState(
|
||||||
|
config *cfg.Config,
|
||||||
nValidators int,
|
nValidators int,
|
||||||
testName string,
|
testName string,
|
||||||
tickerFunc func() TimeoutTicker,
|
tickerFunc func() TimeoutTicker,
|
||||||
@@ -701,7 +709,7 @@ func randConsensusState(
|
|||||||
configOpts ...func(*cfg.Config),
|
configOpts ...func(*cfg.Config),
|
||||||
) ([]*State, cleanupFunc) {
|
) ([]*State, cleanupFunc) {
|
||||||
|
|
||||||
genDoc, privVals := randGenesisDoc(nValidators, false, 30)
|
genDoc, privVals := randGenesisDoc(config, nValidators, false, 30)
|
||||||
css := make([]*State, nValidators)
|
css := make([]*State, nValidators)
|
||||||
logger := consensusLogger()
|
logger := consensusLogger()
|
||||||
|
|
||||||
@@ -748,15 +756,17 @@ func randConsensusState(
|
|||||||
|
|
||||||
// nPeers = nValidators + nNotValidator
|
// nPeers = nValidators + nNotValidator
|
||||||
func randConsensusNetWithPeers(
|
func randConsensusNetWithPeers(
|
||||||
|
config *cfg.Config,
|
||||||
nValidators,
|
nValidators,
|
||||||
nPeers int,
|
nPeers int,
|
||||||
testName string,
|
testName string,
|
||||||
tickerFunc func() TimeoutTicker,
|
tickerFunc func() TimeoutTicker,
|
||||||
appFunc func(string) abci.Application,
|
appFunc func(string) abci.Application,
|
||||||
) ([]*State, *types.GenesisDoc, *cfg.Config, cleanupFunc) {
|
) ([]*State, *types.GenesisDoc, *cfg.Config, cleanupFunc) {
|
||||||
genDoc, privVals := randGenesisDoc(nValidators, false, testMinPower)
|
genDoc, privVals := randGenesisDoc(config, nValidators, false, testMinPower)
|
||||||
css := make([]*State, nPeers)
|
css := make([]*State, nPeers)
|
||||||
logger := consensusLogger()
|
logger := consensusLogger()
|
||||||
|
|
||||||
var peer0Config *cfg.Config
|
var peer0Config *cfg.Config
|
||||||
configRootDirs := make([]string, 0, nPeers)
|
configRootDirs := make([]string, 0, nPeers)
|
||||||
for i := 0; i < nPeers; i++ {
|
for i := 0; i < nPeers; i++ {
|
||||||
@@ -808,7 +818,12 @@ func randConsensusNetWithPeers(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func randGenesisDoc(numValidators int, randPower bool, minPower int64) (*types.GenesisDoc, []types.PrivValidator) {
|
func randGenesisDoc(
|
||||||
|
config *cfg.Config,
|
||||||
|
numValidators int,
|
||||||
|
randPower bool,
|
||||||
|
minPower int64) (*types.GenesisDoc, []types.PrivValidator) {
|
||||||
|
|
||||||
validators := make([]types.GenesisValidator, numValidators)
|
validators := make([]types.GenesisValidator, numValidators)
|
||||||
privValidators := make([]types.PrivValidator, numValidators)
|
privValidators := make([]types.PrivValidator, numValidators)
|
||||||
for i := 0; i < numValidators; i++ {
|
for i := 0; i < numValidators; i++ {
|
||||||
@@ -829,8 +844,13 @@ func randGenesisDoc(numValidators int, randPower bool, minPower int64) (*types.G
|
|||||||
}, privValidators
|
}, privValidators
|
||||||
}
|
}
|
||||||
|
|
||||||
func randGenesisState(numValidators int, randPower bool, minPower int64) (sm.State, []types.PrivValidator) {
|
func randGenesisState(
|
||||||
genDoc, privValidators := randGenesisDoc(numValidators, randPower, minPower)
|
config *cfg.Config,
|
||||||
|
numValidators int,
|
||||||
|
randPower bool,
|
||||||
|
minPower int64) (sm.State, []types.PrivValidator) {
|
||||||
|
|
||||||
|
genDoc, privValidators := randGenesisDoc(config, numValidators, randPower, minPower)
|
||||||
s0, _ := sm.MakeGenesisState(genDoc)
|
s0, _ := sm.MakeGenesisState(genDoc)
|
||||||
return s0, privValidators
|
return s0, privValidators
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestReactorInvalidPrecommit(t *testing.T) {
|
func TestReactorInvalidPrecommit(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
n := 4
|
n := 4
|
||||||
states, cleanup := randConsensusState(n, "consensus_reactor_test", newMockTickerFunc(true), newCounter)
|
states, cleanup := randConsensusState(config, n, "consensus_reactor_test", newMockTickerFunc(true), newCounter)
|
||||||
t.Cleanup(cleanup)
|
t.Cleanup(cleanup)
|
||||||
|
|
||||||
for i := 0; i < 4; i++ {
|
for i := 0; i < 4; i++ {
|
||||||
|
|||||||
+10
-10
@@ -25,13 +25,13 @@ func assertMempool(txn txNotifier) mempl.Mempool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMempoolNoProgressUntilTxsAvailable(t *testing.T) {
|
func TestMempoolNoProgressUntilTxsAvailable(t *testing.T) {
|
||||||
configSetup(t)
|
baseConfig := configSetup(t)
|
||||||
|
|
||||||
config := ResetConfig("consensus_mempool_txs_available_test")
|
config := ResetConfig("consensus_mempool_txs_available_test")
|
||||||
t.Cleanup(func() { _ = os.RemoveAll(config.RootDir) })
|
t.Cleanup(func() { _ = os.RemoveAll(config.RootDir) })
|
||||||
|
|
||||||
config.Consensus.CreateEmptyBlocks = false
|
config.Consensus.CreateEmptyBlocks = false
|
||||||
state, privVals := randGenesisState(1, false, 10)
|
state, privVals := randGenesisState(baseConfig, 1, false, 10)
|
||||||
cs := newStateWithConfig(config, state, privVals[0], NewCounterApplication())
|
cs := newStateWithConfig(config, state, privVals[0], NewCounterApplication())
|
||||||
assertMempool(cs.txNotifier).EnableTxsAvailable()
|
assertMempool(cs.txNotifier).EnableTxsAvailable()
|
||||||
height, round := cs.Height, cs.Round
|
height, round := cs.Height, cs.Round
|
||||||
@@ -47,13 +47,13 @@ func TestMempoolNoProgressUntilTxsAvailable(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMempoolProgressAfterCreateEmptyBlocksInterval(t *testing.T) {
|
func TestMempoolProgressAfterCreateEmptyBlocksInterval(t *testing.T) {
|
||||||
configSetup(t)
|
baseConfig := configSetup(t)
|
||||||
|
|
||||||
config := ResetConfig("consensus_mempool_txs_available_test")
|
config := ResetConfig("consensus_mempool_txs_available_test")
|
||||||
t.Cleanup(func() { _ = os.RemoveAll(config.RootDir) })
|
t.Cleanup(func() { _ = os.RemoveAll(config.RootDir) })
|
||||||
|
|
||||||
config.Consensus.CreateEmptyBlocksInterval = ensureTimeout
|
config.Consensus.CreateEmptyBlocksInterval = ensureTimeout
|
||||||
state, privVals := randGenesisState(1, false, 10)
|
state, privVals := randGenesisState(baseConfig, 1, false, 10)
|
||||||
cs := newStateWithConfig(config, state, privVals[0], NewCounterApplication())
|
cs := newStateWithConfig(config, state, privVals[0], NewCounterApplication())
|
||||||
|
|
||||||
assertMempool(cs.txNotifier).EnableTxsAvailable()
|
assertMempool(cs.txNotifier).EnableTxsAvailable()
|
||||||
@@ -67,13 +67,13 @@ func TestMempoolProgressAfterCreateEmptyBlocksInterval(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMempoolProgressInHigherRound(t *testing.T) {
|
func TestMempoolProgressInHigherRound(t *testing.T) {
|
||||||
configSetup(t)
|
baseConfig := configSetup(t)
|
||||||
|
|
||||||
config := ResetConfig("consensus_mempool_txs_available_test")
|
config := ResetConfig("consensus_mempool_txs_available_test")
|
||||||
t.Cleanup(func() { _ = os.RemoveAll(config.RootDir) })
|
t.Cleanup(func() { _ = os.RemoveAll(config.RootDir) })
|
||||||
|
|
||||||
config.Consensus.CreateEmptyBlocks = false
|
config.Consensus.CreateEmptyBlocks = false
|
||||||
state, privVals := randGenesisState(1, false, 10)
|
state, privVals := randGenesisState(baseConfig, 1, false, 10)
|
||||||
cs := newStateWithConfig(config, state, privVals[0], NewCounterApplication())
|
cs := newStateWithConfig(config, state, privVals[0], NewCounterApplication())
|
||||||
assertMempool(cs.txNotifier).EnableTxsAvailable()
|
assertMempool(cs.txNotifier).EnableTxsAvailable()
|
||||||
height, round := cs.Height, cs.Round
|
height, round := cs.Height, cs.Round
|
||||||
@@ -119,9 +119,9 @@ func deliverTxsRange(cs *State, start, end int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMempoolTxConcurrentWithCommit(t *testing.T) {
|
func TestMempoolTxConcurrentWithCommit(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
state, privVals := randGenesisState(1, false, 10)
|
state, privVals := randGenesisState(config, 1, false, 10)
|
||||||
blockDB := dbm.NewMemDB()
|
blockDB := dbm.NewMemDB()
|
||||||
stateStore := sm.NewStore(blockDB)
|
stateStore := sm.NewStore(blockDB)
|
||||||
cs := newStateWithConfigAndBlockStore(config, state, privVals[0], NewCounterApplication(), blockDB)
|
cs := newStateWithConfigAndBlockStore(config, state, privVals[0], NewCounterApplication(), blockDB)
|
||||||
@@ -145,9 +145,9 @@ func TestMempoolTxConcurrentWithCommit(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestMempoolRmBadTx(t *testing.T) {
|
func TestMempoolRmBadTx(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
state, privVals := randGenesisState(1, false, 10)
|
state, privVals := randGenesisState(config, 1, false, 10)
|
||||||
app := NewCounterApplication()
|
app := NewCounterApplication()
|
||||||
blockDB := dbm.NewMemDB()
|
blockDB := dbm.NewMemDB()
|
||||||
stateStore := sm.NewStore(blockDB)
|
stateStore := sm.NewStore(blockDB)
|
||||||
|
|||||||
@@ -246,10 +246,10 @@ func waitForBlockWithUpdatedValsAndValidateIt(
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReactorBasic(t *testing.T) {
|
func TestReactorBasic(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
n := 4
|
n := 4
|
||||||
states, cleanup := randConsensusState(n, "consensus_reactor_test", newMockTickerFunc(true), newCounter)
|
states, cleanup := randConsensusState(config, n, "consensus_reactor_test", newMockTickerFunc(true), newCounter)
|
||||||
t.Cleanup(cleanup)
|
t.Cleanup(cleanup)
|
||||||
|
|
||||||
rts := setup(t, n, states, 100) // buffer must be large enough to not deadlock
|
rts := setup(t, n, states, 100) // buffer must be large enough to not deadlock
|
||||||
@@ -274,14 +274,14 @@ func TestReactorBasic(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReactorWithEvidence(t *testing.T) {
|
func TestReactorWithEvidence(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
n := 4
|
n := 4
|
||||||
testName := "consensus_reactor_test"
|
testName := "consensus_reactor_test"
|
||||||
tickerFunc := newMockTickerFunc(true)
|
tickerFunc := newMockTickerFunc(true)
|
||||||
appFunc := newCounter
|
appFunc := newCounter
|
||||||
|
|
||||||
genDoc, privVals := randGenesisDoc(n, false, 30)
|
genDoc, privVals := randGenesisDoc(config, n, false, 30)
|
||||||
states := make([]*State, n)
|
states := make([]*State, n)
|
||||||
logger := consensusLogger()
|
logger := consensusLogger()
|
||||||
|
|
||||||
@@ -369,10 +369,11 @@ func TestReactorWithEvidence(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReactorCreatesBlockWhenEmptyBlocksFalse(t *testing.T) {
|
func TestReactorCreatesBlockWhenEmptyBlocksFalse(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
n := 4
|
n := 4
|
||||||
states, cleanup := randConsensusState(
|
states, cleanup := randConsensusState(
|
||||||
|
config,
|
||||||
n,
|
n,
|
||||||
"consensus_reactor_test",
|
"consensus_reactor_test",
|
||||||
newMockTickerFunc(true),
|
newMockTickerFunc(true),
|
||||||
@@ -409,10 +410,10 @@ func TestReactorCreatesBlockWhenEmptyBlocksFalse(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReactorRecordsVotesAndBlockParts(t *testing.T) {
|
func TestReactorRecordsVotesAndBlockParts(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
n := 4
|
n := 4
|
||||||
states, cleanup := randConsensusState(n, "consensus_reactor_test", newMockTickerFunc(true), newCounter)
|
states, cleanup := randConsensusState(config, n, "consensus_reactor_test", newMockTickerFunc(true), newCounter)
|
||||||
t.Cleanup(cleanup)
|
t.Cleanup(cleanup)
|
||||||
|
|
||||||
rts := setup(t, n, states, 100) // buffer must be large enough to not deadlock
|
rts := setup(t, n, states, 100) // buffer must be large enough to not deadlock
|
||||||
@@ -466,10 +467,11 @@ func TestReactorRecordsVotesAndBlockParts(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReactorVotingPowerChange(t *testing.T) {
|
func TestReactorVotingPowerChange(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
n := 4
|
n := 4
|
||||||
states, cleanup := randConsensusState(
|
states, cleanup := randConsensusState(
|
||||||
|
config,
|
||||||
n,
|
n,
|
||||||
"consensus_voting_power_changes_test",
|
"consensus_voting_power_changes_test",
|
||||||
newMockTickerFunc(true),
|
newMockTickerFunc(true),
|
||||||
@@ -565,11 +567,12 @@ func TestReactorVotingPowerChange(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReactorValidatorSetChanges(t *testing.T) {
|
func TestReactorValidatorSetChanges(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
nPeers := 7
|
nPeers := 7
|
||||||
nVals := 4
|
nVals := 4
|
||||||
states, _, _, cleanup := randConsensusNetWithPeers(
|
states, _, _, cleanup := randConsensusNetWithPeers(
|
||||||
|
config,
|
||||||
nVals,
|
nVals,
|
||||||
nPeers,
|
nPeers,
|
||||||
"consensus_val_set_changes_test",
|
"consensus_val_set_changes_test",
|
||||||
|
|||||||
+84
-43
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
@@ -276,25 +277,21 @@ func (w *crashingWAL) Stop() error { return w.next.Stop() }
|
|||||||
func (w *crashingWAL) Wait() { w.next.Wait() }
|
func (w *crashingWAL) Wait() { w.next.Wait() }
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------
|
||||||
type testSim struct {
|
type simulatorTestSuite struct {
|
||||||
GenesisState sm.State
|
GenesisState sm.State
|
||||||
Config *cfg.Config
|
Config *cfg.Config
|
||||||
Chain []*types.Block
|
Chain []*types.Block
|
||||||
Commits []*types.Commit
|
Commits []*types.Commit
|
||||||
CleanupFunc cleanupFunc
|
CleanupFunc cleanupFunc
|
||||||
|
|
||||||
|
Mempool mempl.Mempool
|
||||||
|
Evpool sm.EvidencePool
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
numBlocks = 6
|
numBlocks = 6
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
mempool = emptyMempool{}
|
|
||||||
evpool = sm.EmptyEvidencePool{}
|
|
||||||
|
|
||||||
sim testSim
|
|
||||||
)
|
|
||||||
|
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
// Test handshake/replay
|
// Test handshake/replay
|
||||||
|
|
||||||
@@ -305,12 +302,20 @@ var (
|
|||||||
var modes = []uint{0, 1, 2, 3}
|
var modes = []uint{0, 1, 2, 3}
|
||||||
|
|
||||||
// This is actually not a test, it's for storing validator change tx data for testHandshakeReplay
|
// This is actually not a test, it's for storing validator change tx data for testHandshakeReplay
|
||||||
func TestSimulateValidatorsChange(t *testing.T) {
|
func setupSimulator(t *testing.T) *simulatorTestSuite {
|
||||||
configSetup(t)
|
t.Helper()
|
||||||
|
config := configSetup(t)
|
||||||
|
|
||||||
|
sim := &simulatorTestSuite{
|
||||||
|
Mempool: emptyMempool{},
|
||||||
|
Evpool: sm.EmptyEvidencePool{},
|
||||||
|
}
|
||||||
|
|
||||||
nPeers := 7
|
nPeers := 7
|
||||||
nVals := 4
|
nVals := 4
|
||||||
|
|
||||||
css, genDoc, config, cleanup := randConsensusNetWithPeers(
|
css, genDoc, config, cleanup := randConsensusNetWithPeers(
|
||||||
|
config,
|
||||||
nVals,
|
nVals,
|
||||||
nPeers,
|
nPeers,
|
||||||
"replay_test",
|
"replay_test",
|
||||||
@@ -337,7 +342,11 @@ func TestSimulateValidatorsChange(t *testing.T) {
|
|||||||
ensureNewRound(newRoundCh, height, 0)
|
ensureNewRound(newRoundCh, height, 0)
|
||||||
ensureNewProposal(proposalCh, height, round)
|
ensureNewProposal(proposalCh, height, round)
|
||||||
rs := css[0].GetRoundState()
|
rs := css[0].GetRoundState()
|
||||||
signAddVotes(css[0], tmproto.PrecommitType, rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(), vss[1:nVals]...)
|
|
||||||
|
signAddVotes(sim.Config, css[0], tmproto.PrecommitType,
|
||||||
|
rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(),
|
||||||
|
vss[1:nVals]...)
|
||||||
|
|
||||||
ensureNewRound(newRoundCh, height+1, 0)
|
ensureNewRound(newRoundCh, height+1, 0)
|
||||||
|
|
||||||
// HEIGHT 2
|
// HEIGHT 2
|
||||||
@@ -367,7 +376,9 @@ func TestSimulateValidatorsChange(t *testing.T) {
|
|||||||
}
|
}
|
||||||
ensureNewProposal(proposalCh, height, round)
|
ensureNewProposal(proposalCh, height, round)
|
||||||
rs = css[0].GetRoundState()
|
rs = css[0].GetRoundState()
|
||||||
signAddVotes(css[0], tmproto.PrecommitType, rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(), vss[1:nVals]...)
|
signAddVotes(sim.Config, css[0], tmproto.PrecommitType,
|
||||||
|
rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(),
|
||||||
|
vss[1:nVals]...)
|
||||||
ensureNewRound(newRoundCh, height+1, 0)
|
ensureNewRound(newRoundCh, height+1, 0)
|
||||||
|
|
||||||
// HEIGHT 3
|
// HEIGHT 3
|
||||||
@@ -397,7 +408,9 @@ func TestSimulateValidatorsChange(t *testing.T) {
|
|||||||
}
|
}
|
||||||
ensureNewProposal(proposalCh, height, round)
|
ensureNewProposal(proposalCh, height, round)
|
||||||
rs = css[0].GetRoundState()
|
rs = css[0].GetRoundState()
|
||||||
signAddVotes(css[0], tmproto.PrecommitType, rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(), vss[1:nVals]...)
|
signAddVotes(sim.Config, css[0], tmproto.PrecommitType,
|
||||||
|
rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(),
|
||||||
|
vss[1:nVals]...)
|
||||||
ensureNewRound(newRoundCh, height+1, 0)
|
ensureNewRound(newRoundCh, height+1, 0)
|
||||||
|
|
||||||
// HEIGHT 4
|
// HEIGHT 4
|
||||||
@@ -463,7 +476,9 @@ func TestSimulateValidatorsChange(t *testing.T) {
|
|||||||
if i == selfIndex {
|
if i == selfIndex {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
signAddVotes(css[0], tmproto.PrecommitType, rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(), newVss[i])
|
signAddVotes(sim.Config, css[0],
|
||||||
|
tmproto.PrecommitType, rs.ProposalBlock.Hash(),
|
||||||
|
rs.ProposalBlockParts.Header(), newVss[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
ensureNewRound(newRoundCh, height+1, 0)
|
ensureNewRound(newRoundCh, height+1, 0)
|
||||||
@@ -482,7 +497,9 @@ func TestSimulateValidatorsChange(t *testing.T) {
|
|||||||
if i == selfIndex {
|
if i == selfIndex {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
signAddVotes(css[0], tmproto.PrecommitType, rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(), newVss[i])
|
signAddVotes(sim.Config, css[0],
|
||||||
|
tmproto.PrecommitType, rs.ProposalBlock.Hash(),
|
||||||
|
rs.ProposalBlockParts.Header(), newVss[i])
|
||||||
}
|
}
|
||||||
ensureNewRound(newRoundCh, height+1, 0)
|
ensureNewRound(newRoundCh, height+1, 0)
|
||||||
|
|
||||||
@@ -517,7 +534,9 @@ func TestSimulateValidatorsChange(t *testing.T) {
|
|||||||
if i == selfIndex {
|
if i == selfIndex {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
signAddVotes(css[0], tmproto.PrecommitType, rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(), newVss[i])
|
signAddVotes(sim.Config, css[0],
|
||||||
|
tmproto.PrecommitType, rs.ProposalBlock.Hash(),
|
||||||
|
rs.ProposalBlockParts.Header(), newVss[i])
|
||||||
}
|
}
|
||||||
ensureNewRound(newRoundCh, height+1, 0)
|
ensureNewRound(newRoundCh, height+1, 0)
|
||||||
|
|
||||||
@@ -527,61 +546,67 @@ func TestSimulateValidatorsChange(t *testing.T) {
|
|||||||
sim.Chain = append(sim.Chain, css[0].blockStore.LoadBlock(int64(i)))
|
sim.Chain = append(sim.Chain, css[0].blockStore.LoadBlock(int64(i)))
|
||||||
sim.Commits = append(sim.Commits, css[0].blockStore.LoadBlockCommit(int64(i)))
|
sim.Commits = append(sim.Commits, css[0].blockStore.LoadBlockCommit(int64(i)))
|
||||||
}
|
}
|
||||||
|
if sim.CleanupFunc != nil {
|
||||||
|
t.Cleanup(sim.CleanupFunc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sim
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync from scratch
|
// Sync from scratch
|
||||||
func TestHandshakeReplayAll(t *testing.T) {
|
func TestHandshakeReplayAll(t *testing.T) {
|
||||||
configSetup(t)
|
sim := setupSimulator(t)
|
||||||
|
|
||||||
for _, m := range modes {
|
for _, m := range modes {
|
||||||
testHandshakeReplay(t, config, 0, m, false)
|
testHandshakeReplay(t, sim, 0, m, false)
|
||||||
}
|
}
|
||||||
for _, m := range modes {
|
for _, m := range modes {
|
||||||
testHandshakeReplay(t, config, 0, m, true)
|
testHandshakeReplay(t, sim, 0, m, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync many, not from scratch
|
// Sync many, not from scratch
|
||||||
func TestHandshakeReplaySome(t *testing.T) {
|
func TestHandshakeReplaySome(t *testing.T) {
|
||||||
configSetup(t)
|
sim := setupSimulator(t)
|
||||||
|
|
||||||
for _, m := range modes {
|
for _, m := range modes {
|
||||||
testHandshakeReplay(t, config, 2, m, false)
|
testHandshakeReplay(t, sim, 2, m, false)
|
||||||
}
|
}
|
||||||
for _, m := range modes {
|
for _, m := range modes {
|
||||||
testHandshakeReplay(t, config, 2, m, true)
|
testHandshakeReplay(t, sim, 2, m, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync from lagging by one
|
// Sync from lagging by one
|
||||||
func TestHandshakeReplayOne(t *testing.T) {
|
func TestHandshakeReplayOne(t *testing.T) {
|
||||||
configSetup(t)
|
sim := setupSimulator(t)
|
||||||
|
|
||||||
for _, m := range modes {
|
for _, m := range modes {
|
||||||
testHandshakeReplay(t, config, numBlocks-1, m, false)
|
testHandshakeReplay(t, sim, numBlocks-1, m, false)
|
||||||
}
|
}
|
||||||
for _, m := range modes {
|
for _, m := range modes {
|
||||||
testHandshakeReplay(t, config, numBlocks-1, m, true)
|
testHandshakeReplay(t, sim, numBlocks-1, m, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync from caught up
|
// Sync from caught up
|
||||||
func TestHandshakeReplayNone(t *testing.T) {
|
func TestHandshakeReplayNone(t *testing.T) {
|
||||||
configSetup(t)
|
sim := setupSimulator(t)
|
||||||
|
|
||||||
for _, m := range modes {
|
for _, m := range modes {
|
||||||
testHandshakeReplay(t, config, numBlocks, m, false)
|
testHandshakeReplay(t, sim, numBlocks, m, false)
|
||||||
}
|
}
|
||||||
for _, m := range modes {
|
for _, m := range modes {
|
||||||
testHandshakeReplay(t, config, numBlocks, m, true)
|
testHandshakeReplay(t, sim, numBlocks, m, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test mockProxyApp should not panic when app return ABCIResponses with some empty ResponseDeliverTx
|
// Test mockProxyApp should not panic when app return ABCIResponses with some empty ResponseDeliverTx
|
||||||
func TestMockProxyApp(t *testing.T) {
|
func TestMockProxyApp(t *testing.T) {
|
||||||
configSetup(t)
|
sim := setupSimulator(t) // setup config and simulator
|
||||||
|
config := sim.Config
|
||||||
|
assert.NotNil(t, config)
|
||||||
|
|
||||||
sim.CleanupFunc() // clean the test env created in TestSimulateValidatorsChange
|
|
||||||
logger := log.TestingLogger()
|
logger := log.TestingLogger()
|
||||||
var validTxs, invalidTxs = 0, 0
|
var validTxs, invalidTxs = 0, 0
|
||||||
txIndex := 0
|
txIndex := 0
|
||||||
@@ -648,12 +673,15 @@ func tempWALWithData(data []byte) string {
|
|||||||
|
|
||||||
// Make some blocks. Start a fresh app and apply nBlocks blocks.
|
// Make some blocks. Start a fresh app and apply nBlocks blocks.
|
||||||
// Then restart the app and sync it up with the remaining blocks
|
// Then restart the app and sync it up with the remaining blocks
|
||||||
func testHandshakeReplay(t *testing.T, config *cfg.Config, nBlocks int, mode uint, testValidatorsChange bool) {
|
func testHandshakeReplay(t *testing.T, sim *simulatorTestSuite, nBlocks int, mode uint, testValidatorsChange bool) {
|
||||||
var chain []*types.Block
|
var chain []*types.Block
|
||||||
var commits []*types.Commit
|
var commits []*types.Commit
|
||||||
var store *mockBlockStore
|
var store *mockBlockStore
|
||||||
var stateDB dbm.DB
|
var stateDB dbm.DB
|
||||||
var genesisState sm.State
|
var genesisState sm.State
|
||||||
|
|
||||||
|
config := sim.Config
|
||||||
|
|
||||||
if testValidatorsChange {
|
if testValidatorsChange {
|
||||||
testConfig := ResetConfig(fmt.Sprintf("%s_%v_m", t.Name(), mode))
|
testConfig := ResetConfig(fmt.Sprintf("%s_%v_m", t.Name(), mode))
|
||||||
defer func() { _ = os.RemoveAll(testConfig.RootDir) }()
|
defer func() { _ = os.RemoveAll(testConfig.RootDir) }()
|
||||||
@@ -698,12 +726,12 @@ func testHandshakeReplay(t *testing.T, config *cfg.Config, nBlocks int, mode uin
|
|||||||
|
|
||||||
state := genesisState.Copy()
|
state := genesisState.Copy()
|
||||||
// run the chain through state.ApplyBlock to build up the tendermint state
|
// run the chain through state.ApplyBlock to build up the tendermint state
|
||||||
state = buildTMStateFromChain(config, stateStore, state, chain, nBlocks, mode)
|
state = buildTMStateFromChain(config, sim.Mempool, sim.Evpool, stateStore, state, chain, nBlocks, mode)
|
||||||
latestAppHash := state.AppHash
|
latestAppHash := state.AppHash
|
||||||
|
|
||||||
// make a new client creator
|
// make a new client creator
|
||||||
kvstoreApp := kvstore.NewPersistentKVStoreApplication(
|
kvstoreApp := kvstore.NewPersistentKVStoreApplication(
|
||||||
filepath.Join(config.DBDir(), fmt.Sprintf("replay_test_%d_%d_a", nBlocks, mode)))
|
filepath.Join(config.DBDir(), fmt.Sprintf("replay_test_%d_%d_a_r%d", nBlocks, mode, rand.Int())))
|
||||||
t.Cleanup(func() { require.NoError(t, kvstoreApp.Close()) })
|
t.Cleanup(func() { require.NoError(t, kvstoreApp.Close()) })
|
||||||
|
|
||||||
clientCreator2 := proxy.NewLocalClientCreator(kvstoreApp)
|
clientCreator2 := proxy.NewLocalClientCreator(kvstoreApp)
|
||||||
@@ -715,7 +743,7 @@ func testHandshakeReplay(t *testing.T, config *cfg.Config, nBlocks int, mode uin
|
|||||||
stateStore := sm.NewStore(stateDB1)
|
stateStore := sm.NewStore(stateDB1)
|
||||||
err := stateStore.Save(genesisState)
|
err := stateStore.Save(genesisState)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
buildAppStateFromChain(proxyApp, stateStore, genesisState, chain, nBlocks, mode)
|
buildAppStateFromChain(proxyApp, stateStore, sim.Mempool, sim.Evpool, genesisState, chain, nBlocks, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prune block store if requested
|
// Prune block store if requested
|
||||||
@@ -775,7 +803,12 @@ func testHandshakeReplay(t *testing.T, config *cfg.Config, nBlocks int, mode uin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func applyBlock(stateStore sm.Store, st sm.State, blk *types.Block, proxyApp proxy.AppConns) sm.State {
|
func applyBlock(stateStore sm.Store,
|
||||||
|
mempool mempl.Mempool,
|
||||||
|
evpool sm.EvidencePool,
|
||||||
|
st sm.State,
|
||||||
|
blk *types.Block,
|
||||||
|
proxyApp proxy.AppConns) sm.State {
|
||||||
testPartSize := types.BlockPartSizeBytes
|
testPartSize := types.BlockPartSizeBytes
|
||||||
blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mempool, evpool)
|
blockExec := sm.NewBlockExecutor(stateStore, log.TestingLogger(), proxyApp.Consensus(), mempool, evpool)
|
||||||
|
|
||||||
@@ -787,8 +820,14 @@ func applyBlock(stateStore sm.Store, st sm.State, blk *types.Block, proxyApp pro
|
|||||||
return newState
|
return newState
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildAppStateFromChain(proxyApp proxy.AppConns, stateStore sm.Store,
|
func buildAppStateFromChain(
|
||||||
state sm.State, chain []*types.Block, nBlocks int, mode uint) {
|
proxyApp proxy.AppConns,
|
||||||
|
stateStore sm.Store,
|
||||||
|
mempool mempl.Mempool,
|
||||||
|
evpool sm.EvidencePool,
|
||||||
|
state sm.State,
|
||||||
|
chain []*types.Block,
|
||||||
|
nBlocks int, mode uint) {
|
||||||
// start a new app without handshake, play nBlocks blocks
|
// start a new app without handshake, play nBlocks blocks
|
||||||
if err := proxyApp.Start(); err != nil {
|
if err := proxyApp.Start(); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@@ -809,18 +848,18 @@ func buildAppStateFromChain(proxyApp proxy.AppConns, stateStore sm.Store,
|
|||||||
case 0:
|
case 0:
|
||||||
for i := 0; i < nBlocks; i++ {
|
for i := 0; i < nBlocks; i++ {
|
||||||
block := chain[i]
|
block := chain[i]
|
||||||
state = applyBlock(stateStore, state, block, proxyApp)
|
state = applyBlock(stateStore, mempool, evpool, state, block, proxyApp)
|
||||||
}
|
}
|
||||||
case 1, 2, 3:
|
case 1, 2, 3:
|
||||||
for i := 0; i < nBlocks-1; i++ {
|
for i := 0; i < nBlocks-1; i++ {
|
||||||
block := chain[i]
|
block := chain[i]
|
||||||
state = applyBlock(stateStore, state, block, proxyApp)
|
state = applyBlock(stateStore, mempool, evpool, state, block, proxyApp)
|
||||||
}
|
}
|
||||||
|
|
||||||
if mode == 2 || mode == 3 {
|
if mode == 2 || mode == 3 {
|
||||||
// update the kvstore height and apphash
|
// update the kvstore height and apphash
|
||||||
// as if we ran commit but not
|
// as if we ran commit but not
|
||||||
state = applyBlock(stateStore, state, chain[nBlocks-1], proxyApp)
|
state = applyBlock(stateStore, mempool, evpool, state, chain[nBlocks-1], proxyApp)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("unknown mode %v", mode))
|
panic(fmt.Sprintf("unknown mode %v", mode))
|
||||||
@@ -830,6 +869,8 @@ func buildAppStateFromChain(proxyApp proxy.AppConns, stateStore sm.Store,
|
|||||||
|
|
||||||
func buildTMStateFromChain(
|
func buildTMStateFromChain(
|
||||||
config *cfg.Config,
|
config *cfg.Config,
|
||||||
|
mempool mempl.Mempool,
|
||||||
|
evpool sm.EvidencePool,
|
||||||
stateStore sm.Store,
|
stateStore sm.Store,
|
||||||
state sm.State,
|
state sm.State,
|
||||||
chain []*types.Block,
|
chain []*types.Block,
|
||||||
@@ -861,19 +902,19 @@ func buildTMStateFromChain(
|
|||||||
case 0:
|
case 0:
|
||||||
// sync right up
|
// sync right up
|
||||||
for _, block := range chain {
|
for _, block := range chain {
|
||||||
state = applyBlock(stateStore, state, block, proxyApp)
|
state = applyBlock(stateStore, mempool, evpool, state, block, proxyApp)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 1, 2, 3:
|
case 1, 2, 3:
|
||||||
// sync up to the penultimate as if we stored the block.
|
// sync up to the penultimate as if we stored the block.
|
||||||
// whether we commit or not depends on the appHash
|
// whether we commit or not depends on the appHash
|
||||||
for _, block := range chain[:len(chain)-1] {
|
for _, block := range chain[:len(chain)-1] {
|
||||||
state = applyBlock(stateStore, state, block, proxyApp)
|
state = applyBlock(stateStore, mempool, evpool, state, block, proxyApp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply the final block to a state copy so we can
|
// apply the final block to a state copy so we can
|
||||||
// get the right next appHash but keep the state back
|
// get the right next appHash but keep the state back
|
||||||
applyBlock(stateStore, state, chain[len(chain)-1], proxyApp)
|
applyBlock(stateStore, mempool, evpool, state, chain[len(chain)-1], proxyApp)
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("unknown mode %v", mode))
|
panic(fmt.Sprintf("unknown mode %v", mode))
|
||||||
}
|
}
|
||||||
|
|||||||
+127
-123
@@ -56,9 +56,9 @@ x * TestHalt1 - if we see +2/3 precommits after timing out into new round, we sh
|
|||||||
// ProposeSuite
|
// ProposeSuite
|
||||||
|
|
||||||
func TestStateProposerSelection0(t *testing.T) {
|
func TestStateProposerSelection0(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
newRoundCh := subscribe(cs1.eventBus, types.EventQueryNewRound)
|
newRoundCh := subscribe(cs1.eventBus, types.EventQueryNewRound)
|
||||||
@@ -82,7 +82,7 @@ func TestStateProposerSelection0(t *testing.T) {
|
|||||||
ensureNewProposal(proposalCh, height, round)
|
ensureNewProposal(proposalCh, height, round)
|
||||||
|
|
||||||
rs := cs1.GetRoundState()
|
rs := cs1.GetRoundState()
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(), vss[1:]...)
|
signAddVotes(config, cs1, tmproto.PrecommitType, rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header(), vss[1:]...)
|
||||||
|
|
||||||
// Wait for new round so next validator is set.
|
// Wait for new round so next validator is set.
|
||||||
ensureNewRound(newRoundCh, height+1, 0)
|
ensureNewRound(newRoundCh, height+1, 0)
|
||||||
@@ -98,9 +98,9 @@ func TestStateProposerSelection0(t *testing.T) {
|
|||||||
|
|
||||||
// Now let's do it all again, but starting from round 2 instead of 0
|
// Now let's do it all again, but starting from round 2 instead of 0
|
||||||
func TestStateProposerSelection2(t *testing.T) {
|
func TestStateProposerSelection2(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4) // test needs more work for more than 3 validators
|
cs1, vss := randState(config, 4) // test needs more work for more than 3 validators
|
||||||
height := cs1.Height
|
height := cs1.Height
|
||||||
newRoundCh := subscribe(cs1.eventBus, types.EventQueryNewRound)
|
newRoundCh := subscribe(cs1.eventBus, types.EventQueryNewRound)
|
||||||
|
|
||||||
@@ -128,7 +128,7 @@ func TestStateProposerSelection2(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rs := cs1.GetRoundState()
|
rs := cs1.GetRoundState()
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, rs.ProposalBlockParts.Header(), vss[1:]...)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, rs.ProposalBlockParts.Header(), vss[1:]...)
|
||||||
ensureNewRound(newRoundCh, height, i+round+1) // wait for the new round event each round
|
ensureNewRound(newRoundCh, height, i+round+1) // wait for the new round event each round
|
||||||
incrementRound(vss[1:]...)
|
incrementRound(vss[1:]...)
|
||||||
}
|
}
|
||||||
@@ -137,9 +137,9 @@ func TestStateProposerSelection2(t *testing.T) {
|
|||||||
|
|
||||||
// a non-validator should timeout into the prevote round
|
// a non-validator should timeout into the prevote round
|
||||||
func TestStateEnterProposeNoPrivValidator(t *testing.T) {
|
func TestStateEnterProposeNoPrivValidator(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs, _ := randState(1)
|
cs, _ := randState(config, 1)
|
||||||
cs.SetPrivValidator(nil)
|
cs.SetPrivValidator(nil)
|
||||||
height, round := cs.Height, cs.Round
|
height, round := cs.Height, cs.Round
|
||||||
|
|
||||||
@@ -158,9 +158,9 @@ func TestStateEnterProposeNoPrivValidator(t *testing.T) {
|
|||||||
|
|
||||||
// a validator should not timeout of the prevote round (TODO: unless the block is really big!)
|
// a validator should not timeout of the prevote round (TODO: unless the block is really big!)
|
||||||
func TestStateEnterProposeYesPrivValidator(t *testing.T) {
|
func TestStateEnterProposeYesPrivValidator(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs, _ := randState(1)
|
cs, _ := randState(config, 1)
|
||||||
height, round := cs.Height, cs.Round
|
height, round := cs.Height, cs.Round
|
||||||
|
|
||||||
// Listen for propose timeout event
|
// Listen for propose timeout event
|
||||||
@@ -190,9 +190,9 @@ func TestStateEnterProposeYesPrivValidator(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestStateBadProposal(t *testing.T) {
|
func TestStateBadProposal(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(2)
|
cs1, vss := randState(config, 2)
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
vs2 := vss[1]
|
vs2 := vss[1]
|
||||||
|
|
||||||
@@ -240,19 +240,19 @@ func TestStateBadProposal(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, round, vss[0], nil)
|
validatePrevote(t, cs1, round, vss[0], nil)
|
||||||
|
|
||||||
// add bad prevote from vs2 and wait for it
|
// add bad prevote from vs2 and wait for it
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
|
|
||||||
// wait for precommit
|
// wait for precommit
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
validatePrecommit(t, cs1, round, -1, vss[0], nil, nil)
|
validatePrecommit(t, cs1, round, -1, vss[0], nil, nil)
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrecommitType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStateOversizedBlock(t *testing.T) {
|
func TestStateOversizedBlock(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(2)
|
cs1, vss := randState(config, 2)
|
||||||
cs1.state.ConsensusParams.Block.MaxBytes = 2000
|
cs1.state.ConsensusParams.Block.MaxBytes = 2000
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
vs2 := vss[1]
|
vs2 := vss[1]
|
||||||
@@ -302,11 +302,11 @@ func TestStateOversizedBlock(t *testing.T) {
|
|||||||
// precommit on it
|
// precommit on it
|
||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
validatePrevote(t, cs1, round, vss[0], nil)
|
validatePrevote(t, cs1, round, vss[0], nil)
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
validatePrecommit(t, cs1, round, -1, vss[0], nil, nil)
|
validatePrecommit(t, cs1, round, -1, vss[0], nil, nil)
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrecommitType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
@@ -314,9 +314,9 @@ func TestStateOversizedBlock(t *testing.T) {
|
|||||||
|
|
||||||
// propose, prevote, and precommit a block
|
// propose, prevote, and precommit a block
|
||||||
func TestStateFullRound1(t *testing.T) {
|
func TestStateFullRound1(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs, vss := randState(1)
|
cs, vss := randState(config, 1)
|
||||||
height, round := cs.Height, cs.Round
|
height, round := cs.Height, cs.Round
|
||||||
|
|
||||||
// NOTE: buffer capacity of 0 ensures we can validate prevote and last commit
|
// NOTE: buffer capacity of 0 ensures we can validate prevote and last commit
|
||||||
@@ -356,9 +356,9 @@ func TestStateFullRound1(t *testing.T) {
|
|||||||
|
|
||||||
// nil is proposed, so prevote and precommit nil
|
// nil is proposed, so prevote and precommit nil
|
||||||
func TestStateFullRoundNil(t *testing.T) {
|
func TestStateFullRoundNil(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs, vss := randState(1)
|
cs, vss := randState(config, 1)
|
||||||
height, round := cs.Height, cs.Round
|
height, round := cs.Height, cs.Round
|
||||||
|
|
||||||
voteCh := subscribeUnBuffered(cs.eventBus, types.EventQueryVote)
|
voteCh := subscribeUnBuffered(cs.eventBus, types.EventQueryVote)
|
||||||
@@ -376,9 +376,9 @@ func TestStateFullRoundNil(t *testing.T) {
|
|||||||
// run through propose, prevote, precommit commit with two validators
|
// run through propose, prevote, precommit commit with two validators
|
||||||
// where the first validator has to wait for votes from the second
|
// where the first validator has to wait for votes from the second
|
||||||
func TestStateFullRound2(t *testing.T) {
|
func TestStateFullRound2(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(2)
|
cs1, vss := randState(config, 2)
|
||||||
vs2 := vss[1]
|
vs2 := vss[1]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -395,7 +395,7 @@ func TestStateFullRound2(t *testing.T) {
|
|||||||
propBlockHash, propPartSetHeader := rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header()
|
propBlockHash, propPartSetHeader := rs.ProposalBlock.Hash(), rs.ProposalBlockParts.Header()
|
||||||
|
|
||||||
// prevote arrives from vs2:
|
// prevote arrives from vs2:
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlockHash, propPartSetHeader, vs2)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlockHash, propPartSetHeader, vs2)
|
||||||
ensurePrevote(voteCh, height, round) // prevote
|
ensurePrevote(voteCh, height, round) // prevote
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round) // precommit
|
ensurePrecommit(voteCh, height, round) // precommit
|
||||||
@@ -405,7 +405,7 @@ func TestStateFullRound2(t *testing.T) {
|
|||||||
// we should be stuck in limbo waiting for more precommits
|
// we should be stuck in limbo waiting for more precommits
|
||||||
|
|
||||||
// precommit arrives from vs2:
|
// precommit arrives from vs2:
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, propBlockHash, propPartSetHeader, vs2)
|
signAddVotes(config, cs1, tmproto.PrecommitType, propBlockHash, propPartSetHeader, vs2)
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
|
|
||||||
// wait to finish commit, propose in next height
|
// wait to finish commit, propose in next height
|
||||||
@@ -418,9 +418,9 @@ func TestStateFullRound2(t *testing.T) {
|
|||||||
// two validators, 4 rounds.
|
// two validators, 4 rounds.
|
||||||
// two vals take turns proposing. val1 locks on first one, precommits nil on everything else
|
// two vals take turns proposing. val1 locks on first one, precommits nil on everything else
|
||||||
func TestStateLockNoPOL(t *testing.T) {
|
func TestStateLockNoPOL(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(2)
|
cs1, vss := randState(config, 2)
|
||||||
vs2 := vss[1]
|
vs2 := vss[1]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -451,7 +451,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
|
|
||||||
// we should now be stuck in limbo forever, waiting for more prevotes
|
// we should now be stuck in limbo forever, waiting for more prevotes
|
||||||
// prevote arrives from vs2:
|
// prevote arrives from vs2:
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, theBlockHash, thePartSetHeader, vs2)
|
signAddVotes(config, cs1, tmproto.PrevoteType, theBlockHash, thePartSetHeader, vs2)
|
||||||
ensurePrevote(voteCh, height, round) // prevote
|
ensurePrevote(voteCh, height, round) // prevote
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round) // precommit
|
ensurePrecommit(voteCh, height, round) // precommit
|
||||||
@@ -463,7 +463,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
hash := make([]byte, len(theBlockHash))
|
hash := make([]byte, len(theBlockHash))
|
||||||
copy(hash, theBlockHash)
|
copy(hash, theBlockHash)
|
||||||
hash[0] = (hash[0] + 1) % 255
|
hash[0] = (hash[0] + 1) % 255
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, hash, thePartSetHeader, vs2)
|
signAddVotes(config, cs1, tmproto.PrecommitType, hash, thePartSetHeader, vs2)
|
||||||
ensurePrecommit(voteCh, height, round) // precommit
|
ensurePrecommit(voteCh, height, round) // precommit
|
||||||
|
|
||||||
// (note we're entering precommit for a second time this round)
|
// (note we're entering precommit for a second time this round)
|
||||||
@@ -496,7 +496,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, round, vss[0], rs.LockedBlock.Hash())
|
validatePrevote(t, cs1, round, vss[0], rs.LockedBlock.Hash())
|
||||||
|
|
||||||
// add a conflicting prevote from the other validator
|
// add a conflicting prevote from the other validator
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, hash, rs.LockedBlock.MakePartSet(partSize).Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrevoteType, hash, rs.LockedBlock.MakePartSet(partSize).Header(), vs2)
|
||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
|
|
||||||
// now we're going to enter prevote again, but with invalid args
|
// now we're going to enter prevote again, but with invalid args
|
||||||
@@ -509,7 +509,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
validatePrecommit(t, cs1, round, 0, vss[0], nil, theBlockHash)
|
validatePrecommit(t, cs1, round, 0, vss[0], nil, theBlockHash)
|
||||||
|
|
||||||
// add conflicting precommit from vs2
|
// add conflicting precommit from vs2
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, hash, rs.LockedBlock.MakePartSet(partSize).Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrecommitType, hash, rs.LockedBlock.MakePartSet(partSize).Header(), vs2)
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
|
|
||||||
// (note we're entering precommit for a second time this round, but with invalid args
|
// (note we're entering precommit for a second time this round, but with invalid args
|
||||||
@@ -539,7 +539,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round) // prevote
|
ensurePrevote(voteCh, height, round) // prevote
|
||||||
validatePrevote(t, cs1, round, vss[0], rs.LockedBlock.Hash())
|
validatePrevote(t, cs1, round, vss[0], rs.LockedBlock.Hash())
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, hash, rs.ProposalBlock.MakePartSet(partSize).Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrevoteType, hash, rs.ProposalBlock.MakePartSet(partSize).Header(), vs2)
|
||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
|
|
||||||
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Prevote(round).Nanoseconds())
|
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Prevote(round).Nanoseconds())
|
||||||
@@ -548,6 +548,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
validatePrecommit(t, cs1, round, 0, vss[0], nil, theBlockHash) // precommit nil but be locked on proposal
|
validatePrecommit(t, cs1, round, 0, vss[0], nil, theBlockHash) // precommit nil but be locked on proposal
|
||||||
|
|
||||||
signAddVotes(
|
signAddVotes(
|
||||||
|
config,
|
||||||
cs1,
|
cs1,
|
||||||
tmproto.PrecommitType,
|
tmproto.PrecommitType,
|
||||||
hash,
|
hash,
|
||||||
@@ -557,7 +558,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
|
|
||||||
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds())
|
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds())
|
||||||
|
|
||||||
cs2, _ := randState(2) // needed so generated block is different than locked block
|
cs2, _ := randState(config, 2) // needed so generated block is different than locked block
|
||||||
// before we time out into new round, set next proposal block
|
// before we time out into new round, set next proposal block
|
||||||
prop, propBlock := decideProposal(cs2, vs2, vs2.Height, vs2.Round+1)
|
prop, propBlock := decideProposal(cs2, vs2, vs2.Height, vs2.Round+1)
|
||||||
if prop == nil || propBlock == nil {
|
if prop == nil || propBlock == nil {
|
||||||
@@ -585,7 +586,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, 3, vss[0], cs1.LockedBlock.Hash())
|
validatePrevote(t, cs1, 3, vss[0], cs1.LockedBlock.Hash())
|
||||||
|
|
||||||
// prevote for proposed block
|
// prevote for proposed block
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2)
|
||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
|
|
||||||
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Prevote(round).Nanoseconds())
|
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Prevote(round).Nanoseconds())
|
||||||
@@ -593,6 +594,7 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
validatePrecommit(t, cs1, round, 0, vss[0], nil, theBlockHash) // precommit nil but locked on proposal
|
validatePrecommit(t, cs1, round, 0, vss[0], nil, theBlockHash) // precommit nil but locked on proposal
|
||||||
|
|
||||||
signAddVotes(
|
signAddVotes(
|
||||||
|
config,
|
||||||
cs1,
|
cs1,
|
||||||
tmproto.PrecommitType,
|
tmproto.PrecommitType,
|
||||||
propBlock.Hash(),
|
propBlock.Hash(),
|
||||||
@@ -606,9 +608,9 @@ func TestStateLockNoPOL(t *testing.T) {
|
|||||||
// in round two: v1 prevotes the same block that the node is locked on
|
// in round two: v1 prevotes the same block that the node is locked on
|
||||||
// the others prevote a new block hence v1 changes lock and precommits the new block with the others
|
// the others prevote a new block hence v1 changes lock and precommits the new block with the others
|
||||||
func TestStateLockPOLRelock(t *testing.T) {
|
func TestStateLockPOLRelock(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -642,14 +644,14 @@ func TestStateLockPOLRelock(t *testing.T) {
|
|||||||
|
|
||||||
ensurePrevote(voteCh, height, round) // prevote
|
ensurePrevote(voteCh, height, round) // prevote
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round) // our precommit
|
ensurePrecommit(voteCh, height, round) // our precommit
|
||||||
// the proposed block should now be locked and our precommit added
|
// the proposed block should now be locked and our precommit added
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash)
|
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash)
|
||||||
|
|
||||||
// add precommits from the rest
|
// add precommits from the rest
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
// before we timeout to the new round set the new proposal
|
// before we timeout to the new round set the new proposal
|
||||||
cs2 := newState(cs1.state, vs2, counter.NewApplication(true))
|
cs2 := newState(cs1.state, vs2, counter.NewApplication(true))
|
||||||
@@ -690,14 +692,14 @@ func TestStateLockPOLRelock(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, round, vss[0], theBlockHash)
|
validatePrevote(t, cs1, round, vss[0], theBlockHash)
|
||||||
|
|
||||||
// now lets add prevotes from everyone else for the new block
|
// now lets add prevotes from everyone else for the new block
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// we should have unlocked and locked on the new block, sending a precommit for this new block
|
// we should have unlocked and locked on the new block, sending a precommit for this new block
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], propBlockHash, propBlockHash)
|
validatePrecommit(t, cs1, round, round, vss[0], propBlockHash, propBlockHash)
|
||||||
|
|
||||||
// more prevote creating a majority on the new block and this is then committed
|
// more prevote creating a majority on the new block and this is then committed
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, propBlockHash, propBlockParts.Header(), vs2, vs3)
|
signAddVotes(config, cs1, tmproto.PrecommitType, propBlockHash, propBlockParts.Header(), vs2, vs3)
|
||||||
ensureNewBlockHeader(newBlockCh, height, propBlockHash)
|
ensureNewBlockHeader(newBlockCh, height, propBlockHash)
|
||||||
|
|
||||||
ensureNewRound(newRoundCh, height+1, 0)
|
ensureNewRound(newRoundCh, height+1, 0)
|
||||||
@@ -705,9 +707,9 @@ func TestStateLockPOLRelock(t *testing.T) {
|
|||||||
|
|
||||||
// 4 vals, one precommits, other 3 polka at next round, so we unlock and precomit the polka
|
// 4 vals, one precommits, other 3 polka at next round, so we unlock and precomit the polka
|
||||||
func TestStateLockPOLUnlock(t *testing.T) {
|
func TestStateLockPOLUnlock(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -741,15 +743,15 @@ func TestStateLockPOLUnlock(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
validatePrevote(t, cs1, round, vss[0], theBlockHash)
|
validatePrevote(t, cs1, round, vss[0], theBlockHash)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// the proposed block should now be locked and our precommit added
|
// the proposed block should now be locked and our precommit added
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash)
|
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash)
|
||||||
|
|
||||||
// add precommits from the rest
|
// add precommits from the rest
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs4)
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs3)
|
signAddVotes(config, cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs3)
|
||||||
|
|
||||||
// before we time out into new round, set next proposal block
|
// before we time out into new round, set next proposal block
|
||||||
prop, propBlock := decideProposal(cs1, vs2, vs2.Height, vs2.Round+1)
|
prop, propBlock := decideProposal(cs1, vs2, vs2.Height, vs2.Round+1)
|
||||||
@@ -780,7 +782,7 @@ func TestStateLockPOLUnlock(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
validatePrevote(t, cs1, round, vss[0], lockedBlockHash)
|
validatePrevote(t, cs1, round, vss[0], lockedBlockHash)
|
||||||
// now lets add prevotes from everyone else for nil (a polka!)
|
// now lets add prevotes from everyone else for nil (a polka!)
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
// the polka makes us unlock and precommit nil
|
// the polka makes us unlock and precommit nil
|
||||||
ensureNewUnlock(unlockCh, height, round)
|
ensureNewUnlock(unlockCh, height, round)
|
||||||
@@ -790,7 +792,7 @@ func TestStateLockPOLUnlock(t *testing.T) {
|
|||||||
// NOTE: since we don't relock on nil, the lock round is -1
|
// NOTE: since we don't relock on nil, the lock round is -1
|
||||||
validatePrecommit(t, cs1, round, -1, vss[0], nil, nil)
|
validatePrecommit(t, cs1, round, -1, vss[0], nil, nil)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3)
|
||||||
ensureNewRound(newRoundCh, height, round+1)
|
ensureNewRound(newRoundCh, height, round+1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -799,9 +801,9 @@ func TestStateLockPOLUnlock(t *testing.T) {
|
|||||||
// v1 should unlock and precommit nil. In the third round another block is proposed, all vals
|
// v1 should unlock and precommit nil. In the third round another block is proposed, all vals
|
||||||
// prevote and now v1 can lock onto the third block and precommit that
|
// prevote and now v1 can lock onto the third block and precommit that
|
||||||
func TestStateLockPOLUnlockOnUnknownBlock(t *testing.T) {
|
func TestStateLockPOLUnlockOnUnknownBlock(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -831,14 +833,14 @@ func TestStateLockPOLUnlockOnUnknownBlock(t *testing.T) {
|
|||||||
|
|
||||||
ensurePrevote(voteCh, height, round) // prevote
|
ensurePrevote(voteCh, height, round) // prevote
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, firstBlockHash, firstBlockParts, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, firstBlockHash, firstBlockParts, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round) // our precommit
|
ensurePrecommit(voteCh, height, round) // our precommit
|
||||||
// the proposed block should now be locked and our precommit added
|
// the proposed block should now be locked and our precommit added
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], firstBlockHash, firstBlockHash)
|
validatePrecommit(t, cs1, round, round, vss[0], firstBlockHash, firstBlockHash)
|
||||||
|
|
||||||
// add precommits from the rest
|
// add precommits from the rest
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
// before we timeout to the new round set the new proposal
|
// before we timeout to the new round set the new proposal
|
||||||
cs2 := newState(cs1.state, vs2, counter.NewApplication(true))
|
cs2 := newState(cs1.state, vs2, counter.NewApplication(true))
|
||||||
@@ -871,7 +873,7 @@ func TestStateLockPOLUnlockOnUnknownBlock(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, round, vss[0], firstBlockHash)
|
validatePrevote(t, cs1, round, vss[0], firstBlockHash)
|
||||||
|
|
||||||
// now lets add prevotes from everyone else for the new block
|
// now lets add prevotes from everyone else for the new block
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, secondBlockHash, secondBlockParts.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, secondBlockHash, secondBlockParts.Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// we should have unlocked and locked on the new block, sending a precommit for this new block
|
// we should have unlocked and locked on the new block, sending a precommit for this new block
|
||||||
@@ -882,7 +884,7 @@ func TestStateLockPOLUnlockOnUnknownBlock(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// more prevote creating a majority on the new block and this is then committed
|
// more prevote creating a majority on the new block and this is then committed
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
// before we timeout to the new round set the new proposal
|
// before we timeout to the new round set the new proposal
|
||||||
cs3 := newState(cs1.state, vs3, counter.NewApplication(true))
|
cs3 := newState(cs1.state, vs3, counter.NewApplication(true))
|
||||||
@@ -915,7 +917,7 @@ func TestStateLockPOLUnlockOnUnknownBlock(t *testing.T) {
|
|||||||
// we are no longer locked to the first block so we should be able to prevote
|
// we are no longer locked to the first block so we should be able to prevote
|
||||||
validatePrevote(t, cs1, round, vss[0], thirdPropBlockHash)
|
validatePrevote(t, cs1, round, vss[0], thirdPropBlockHash)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, thirdPropBlockHash, thirdPropBlockParts.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, thirdPropBlockHash, thirdPropBlockParts.Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// we have a majority, now vs1 can change lock to the third block
|
// we have a majority, now vs1 can change lock to the third block
|
||||||
@@ -927,9 +929,9 @@ func TestStateLockPOLUnlockOnUnknownBlock(t *testing.T) {
|
|||||||
// then a polka at round 2 that we lock on
|
// then a polka at round 2 that we lock on
|
||||||
// then we see the polka from round 1 but shouldn't unlock
|
// then we see the polka from round 1 but shouldn't unlock
|
||||||
func TestStateLockPOLSafety1(t *testing.T) {
|
func TestStateLockPOLSafety1(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -956,12 +958,14 @@ func TestStateLockPOLSafety1(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, round, vss[0], propBlock.Hash())
|
validatePrevote(t, cs1, round, vss[0], propBlock.Hash())
|
||||||
|
|
||||||
// the others sign a polka but we don't see it
|
// the others sign a polka but we don't see it
|
||||||
prevotes := signVotes(tmproto.PrevoteType, propBlock.Hash(), propBlock.MakePartSet(partSize).Header(), vs2, vs3, vs4)
|
prevotes := signVotes(config, tmproto.PrevoteType,
|
||||||
|
propBlock.Hash(), propBlock.MakePartSet(partSize).Header(),
|
||||||
|
vs2, vs3, vs4)
|
||||||
|
|
||||||
t.Logf("old prop hash %v", fmt.Sprintf("%X", propBlock.Hash()))
|
t.Logf("old prop hash %v", fmt.Sprintf("%X", propBlock.Hash()))
|
||||||
|
|
||||||
// we do see them precommit nil
|
// we do see them precommit nil
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
// cs1 precommit nil
|
// cs1 precommit nil
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
@@ -1001,13 +1005,13 @@ func TestStateLockPOLSafety1(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, round, vss[0], propBlockHash)
|
validatePrevote(t, cs1, round, vss[0], propBlockHash)
|
||||||
|
|
||||||
// now we see the others prevote for it, so we should lock on it
|
// now we see the others prevote for it, so we should lock on it
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// we should have precommitted
|
// we should have precommitted
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], propBlockHash, propBlockHash)
|
validatePrecommit(t, cs1, round, round, vss[0], propBlockHash, propBlockHash)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds())
|
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds())
|
||||||
|
|
||||||
@@ -1048,9 +1052,9 @@ func TestStateLockPOLSafety1(t *testing.T) {
|
|||||||
// What we want:
|
// What we want:
|
||||||
// dont see P0, lock on P1 at R1, dont unlock using P0 at R2
|
// dont see P0, lock on P1 at R1, dont unlock using P0 at R2
|
||||||
func TestStateLockPOLSafety2(t *testing.T) {
|
func TestStateLockPOLSafety2(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -1073,7 +1077,7 @@ func TestStateLockPOLSafety2(t *testing.T) {
|
|||||||
propBlockID0 := types.BlockID{Hash: propBlockHash0, PartSetHeader: propBlockParts0.Header()}
|
propBlockID0 := types.BlockID{Hash: propBlockHash0, PartSetHeader: propBlockParts0.Header()}
|
||||||
|
|
||||||
// the others sign a polka but we don't see it
|
// the others sign a polka but we don't see it
|
||||||
prevotes := signVotes(tmproto.PrevoteType, propBlockHash0, propBlockParts0.Header(), vs2, vs3, vs4)
|
prevotes := signVotes(config, tmproto.PrevoteType, propBlockHash0, propBlockParts0.Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
// the block for round 1
|
// the block for round 1
|
||||||
prop1, propBlock1 := decideProposal(cs1, vs2, vs2.Height, vs2.Round+1)
|
prop1, propBlock1 := decideProposal(cs1, vs2, vs2.Height, vs2.Round+1)
|
||||||
@@ -1096,15 +1100,15 @@ func TestStateLockPOLSafety2(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
validatePrevote(t, cs1, round, vss[0], propBlockHash1)
|
validatePrevote(t, cs1, round, vss[0], propBlockHash1)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlockHash1, propBlockParts1.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlockHash1, propBlockParts1.Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// the proposed block should now be locked and our precommit added
|
// the proposed block should now be locked and our precommit added
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], propBlockHash1, propBlockHash1)
|
validatePrecommit(t, cs1, round, round, vss[0], propBlockHash1, propBlockHash1)
|
||||||
|
|
||||||
// add precommits from the rest
|
// add precommits from the rest
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs4)
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, propBlockHash1, propBlockParts1.Header(), vs3)
|
signAddVotes(config, cs1, tmproto.PrecommitType, propBlockHash1, propBlockParts1.Header(), vs3)
|
||||||
|
|
||||||
incrementRound(vs2, vs3, vs4)
|
incrementRound(vs2, vs3, vs4)
|
||||||
|
|
||||||
@@ -1147,9 +1151,9 @@ func TestStateLockPOLSafety2(t *testing.T) {
|
|||||||
// What we want:
|
// What we want:
|
||||||
// P0 proposes B0 at R3.
|
// P0 proposes B0 at R3.
|
||||||
func TestProposeValidBlock(t *testing.T) {
|
func TestProposeValidBlock(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -1178,13 +1182,13 @@ func TestProposeValidBlock(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, round, vss[0], propBlockHash)
|
validatePrevote(t, cs1, round, vss[0], propBlockHash)
|
||||||
|
|
||||||
// the others sign a polka
|
// the others sign a polka
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlockHash, propBlock.MakePartSet(partSize).Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlockHash, propBlock.MakePartSet(partSize).Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// we should have precommitted
|
// we should have precommitted
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], propBlockHash, propBlockHash)
|
validatePrecommit(t, cs1, round, round, vss[0], propBlockHash, propBlockHash)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds())
|
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds())
|
||||||
|
|
||||||
@@ -1201,7 +1205,7 @@ func TestProposeValidBlock(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
validatePrevote(t, cs1, round, vss[0], propBlockHash)
|
validatePrevote(t, cs1, round, vss[0], propBlockHash)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensureNewUnlock(unlockCh, height, round)
|
ensureNewUnlock(unlockCh, height, round)
|
||||||
|
|
||||||
@@ -1212,7 +1216,7 @@ func TestProposeValidBlock(t *testing.T) {
|
|||||||
incrementRound(vs2, vs3, vs4)
|
incrementRound(vs2, vs3, vs4)
|
||||||
incrementRound(vs2, vs3, vs4)
|
incrementRound(vs2, vs3, vs4)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
round += 2 // moving to the next round
|
round += 2 // moving to the next round
|
||||||
|
|
||||||
@@ -1239,9 +1243,9 @@ func TestProposeValidBlock(t *testing.T) {
|
|||||||
// What we want:
|
// What we want:
|
||||||
// P0 miss to lock B but set valid block to B after receiving delayed prevote.
|
// P0 miss to lock B but set valid block to B after receiving delayed prevote.
|
||||||
func TestSetValidBlockOnDelayedPrevote(t *testing.T) {
|
func TestSetValidBlockOnDelayedPrevote(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -1270,10 +1274,10 @@ func TestSetValidBlockOnDelayedPrevote(t *testing.T) {
|
|||||||
validatePrevote(t, cs1, round, vss[0], propBlockHash)
|
validatePrevote(t, cs1, round, vss[0], propBlockHash)
|
||||||
|
|
||||||
// vs2 send prevote for propBlock
|
// vs2 send prevote for propBlock
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs2)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs2)
|
||||||
|
|
||||||
// vs3 send prevote nil
|
// vs3 send prevote nil
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs3)
|
signAddVotes(config, cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs3)
|
||||||
|
|
||||||
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Prevote(round).Nanoseconds())
|
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Prevote(round).Nanoseconds())
|
||||||
|
|
||||||
@@ -1288,7 +1292,7 @@ func TestSetValidBlockOnDelayedPrevote(t *testing.T) {
|
|||||||
assert.True(t, rs.ValidRound == -1)
|
assert.True(t, rs.ValidRound == -1)
|
||||||
|
|
||||||
// vs2 send (delayed) prevote for propBlock
|
// vs2 send (delayed) prevote for propBlock
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs4)
|
||||||
|
|
||||||
ensureNewValidBlock(validBlockCh, height, round)
|
ensureNewValidBlock(validBlockCh, height, round)
|
||||||
|
|
||||||
@@ -1303,9 +1307,9 @@ func TestSetValidBlockOnDelayedPrevote(t *testing.T) {
|
|||||||
// P0 miss to lock B as Proposal Block is missing, but set valid block to B after
|
// P0 miss to lock B as Proposal Block is missing, but set valid block to B after
|
||||||
// receiving delayed Block Proposal.
|
// receiving delayed Block Proposal.
|
||||||
func TestSetValidBlockOnDelayedProposal(t *testing.T) {
|
func TestSetValidBlockOnDelayedProposal(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -1337,7 +1341,7 @@ func TestSetValidBlockOnDelayedProposal(t *testing.T) {
|
|||||||
propBlockParts := propBlock.MakePartSet(partSize)
|
propBlockParts := propBlock.MakePartSet(partSize)
|
||||||
|
|
||||||
// vs2, vs3 and vs4 send prevote for propBlock
|
// vs2, vs3 and vs4 send prevote for propBlock
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
||||||
ensureNewValidBlock(validBlockCh, height, round)
|
ensureNewValidBlock(validBlockCh, height, round)
|
||||||
|
|
||||||
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Prevote(round).Nanoseconds())
|
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Prevote(round).Nanoseconds())
|
||||||
@@ -1361,9 +1365,9 @@ func TestSetValidBlockOnDelayedProposal(t *testing.T) {
|
|||||||
// What we want:
|
// What we want:
|
||||||
// P0 waits for timeoutPrecommit before starting next round
|
// P0 waits for timeoutPrecommit before starting next round
|
||||||
func TestWaitingTimeoutOnNilPolka(t *testing.T) {
|
func TestWaitingTimeoutOnNilPolka(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -1374,7 +1378,7 @@ func TestWaitingTimeoutOnNilPolka(t *testing.T) {
|
|||||||
startTestRound(cs1, height, round)
|
startTestRound(cs1, height, round)
|
||||||
ensureNewRound(newRoundCh, height, round)
|
ensureNewRound(newRoundCh, height, round)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds())
|
ensureNewTimeout(timeoutWaitCh, height, round, cs1.config.Precommit(round).Nanoseconds())
|
||||||
ensureNewRound(newRoundCh, height, round+1)
|
ensureNewRound(newRoundCh, height, round+1)
|
||||||
@@ -1384,9 +1388,9 @@ func TestWaitingTimeoutOnNilPolka(t *testing.T) {
|
|||||||
// What we want:
|
// What we want:
|
||||||
// P0 waits for timeoutPropose in the next round before entering prevote
|
// P0 waits for timeoutPropose in the next round before entering prevote
|
||||||
func TestWaitingTimeoutProposeOnNewRound(t *testing.T) {
|
func TestWaitingTimeoutProposeOnNewRound(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -1404,7 +1408,7 @@ func TestWaitingTimeoutProposeOnNewRound(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
|
|
||||||
incrementRound(vss[1:]...)
|
incrementRound(vss[1:]...)
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
round++ // moving to the next round
|
round++ // moving to the next round
|
||||||
ensureNewRound(newRoundCh, height, round)
|
ensureNewRound(newRoundCh, height, round)
|
||||||
@@ -1422,9 +1426,9 @@ func TestWaitingTimeoutProposeOnNewRound(t *testing.T) {
|
|||||||
// What we want:
|
// What we want:
|
||||||
// P0 jump to higher round, precommit and start precommit wait
|
// P0 jump to higher round, precommit and start precommit wait
|
||||||
func TestRoundSkipOnNilPolkaFromHigherRound(t *testing.T) {
|
func TestRoundSkipOnNilPolkaFromHigherRound(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
|
|
||||||
@@ -1442,7 +1446,7 @@ func TestRoundSkipOnNilPolkaFromHigherRound(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
|
|
||||||
incrementRound(vss[1:]...)
|
incrementRound(vss[1:]...)
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
round++ // moving to the next round
|
round++ // moving to the next round
|
||||||
ensureNewRound(newRoundCh, height, round)
|
ensureNewRound(newRoundCh, height, round)
|
||||||
@@ -1460,9 +1464,9 @@ func TestRoundSkipOnNilPolkaFromHigherRound(t *testing.T) {
|
|||||||
// What we want:
|
// What we want:
|
||||||
// P0 wait for timeoutPropose to expire before sending prevote.
|
// P0 wait for timeoutPropose to expire before sending prevote.
|
||||||
func TestWaitTimeoutProposeOnNilPolkaForTheCurrentRound(t *testing.T) {
|
func TestWaitTimeoutProposeOnNilPolkaForTheCurrentRound(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, int32(1)
|
height, round := cs1.Height, int32(1)
|
||||||
|
|
||||||
@@ -1478,7 +1482,7 @@ func TestWaitTimeoutProposeOnNilPolkaForTheCurrentRound(t *testing.T) {
|
|||||||
ensureNewRound(newRoundCh, height, round)
|
ensureNewRound(newRoundCh, height, round)
|
||||||
|
|
||||||
incrementRound(vss[1:]...)
|
incrementRound(vss[1:]...)
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, nil, types.PartSetHeader{}, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds())
|
ensureNewTimeout(timeoutProposeCh, height, round, cs1.config.Propose(round).Nanoseconds())
|
||||||
|
|
||||||
@@ -1489,9 +1493,9 @@ func TestWaitTimeoutProposeOnNilPolkaForTheCurrentRound(t *testing.T) {
|
|||||||
// What we want:
|
// What we want:
|
||||||
// P0 emit NewValidBlock event upon receiving 2/3+ Precommit for B but hasn't received block B yet
|
// P0 emit NewValidBlock event upon receiving 2/3+ Precommit for B but hasn't received block B yet
|
||||||
func TestEmitNewValidBlockEventOnCommitWithoutBlock(t *testing.T) {
|
func TestEmitNewValidBlockEventOnCommitWithoutBlock(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, int32(1)
|
height, round := cs1.Height, int32(1)
|
||||||
|
|
||||||
@@ -1511,7 +1515,7 @@ func TestEmitNewValidBlockEventOnCommitWithoutBlock(t *testing.T) {
|
|||||||
ensureNewRound(newRoundCh, height, round)
|
ensureNewRound(newRoundCh, height, round)
|
||||||
|
|
||||||
// vs2, vs3 and vs4 send precommit for propBlock
|
// vs2, vs3 and vs4 send precommit for propBlock
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
||||||
ensureNewValidBlock(validBlockCh, height, round)
|
ensureNewValidBlock(validBlockCh, height, round)
|
||||||
|
|
||||||
rs := cs1.GetRoundState()
|
rs := cs1.GetRoundState()
|
||||||
@@ -1525,9 +1529,9 @@ func TestEmitNewValidBlockEventOnCommitWithoutBlock(t *testing.T) {
|
|||||||
// P0 receives 2/3+ Precommit for B for round 0, while being in round 1. It emits NewValidBlock event.
|
// P0 receives 2/3+ Precommit for B for round 0, while being in round 1. It emits NewValidBlock event.
|
||||||
// After receiving block, it executes block and moves to the next height.
|
// After receiving block, it executes block and moves to the next height.
|
||||||
func TestCommitFromPreviousRound(t *testing.T) {
|
func TestCommitFromPreviousRound(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, int32(1)
|
height, round := cs1.Height, int32(1)
|
||||||
|
|
||||||
@@ -1546,7 +1550,7 @@ func TestCommitFromPreviousRound(t *testing.T) {
|
|||||||
ensureNewRound(newRoundCh, height, round)
|
ensureNewRound(newRoundCh, height, round)
|
||||||
|
|
||||||
// vs2, vs3 and vs4 send precommit for propBlock for the previous round
|
// vs2, vs3 and vs4 send precommit for propBlock for the previous round
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, propBlockHash, propBlockParts.Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
ensureNewValidBlock(validBlockCh, height, round)
|
ensureNewValidBlock(validBlockCh, height, round)
|
||||||
|
|
||||||
@@ -1580,10 +1584,10 @@ func (n *fakeTxNotifier) Notify() {
|
|||||||
// and third precommit arrives which leads to the commit of that header and the correct
|
// and third precommit arrives which leads to the commit of that header and the correct
|
||||||
// start of the next round
|
// start of the next round
|
||||||
func TestStartNextHeightCorrectlyAfterTimeout(t *testing.T) {
|
func TestStartNextHeightCorrectlyAfterTimeout(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
config.Consensus.SkipTimeoutCommit = false
|
config.Consensus.SkipTimeoutCommit = false
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
cs1.txNotifier = &fakeTxNotifier{ch: make(chan struct{})}
|
cs1.txNotifier = &fakeTxNotifier{ch: make(chan struct{})}
|
||||||
|
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
@@ -1612,15 +1616,15 @@ func TestStartNextHeightCorrectlyAfterTimeout(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
validatePrevote(t, cs1, round, vss[0], theBlockHash)
|
validatePrevote(t, cs1, round, vss[0], theBlockHash)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// the proposed block should now be locked and our precommit added
|
// the proposed block should now be locked and our precommit added
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash)
|
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash)
|
||||||
|
|
||||||
// add precommits
|
// add precommits
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2)
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs3)
|
signAddVotes(config, cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs3)
|
||||||
|
|
||||||
// wait till timeout occurs
|
// wait till timeout occurs
|
||||||
ensurePrecommitTimeout(precommitTimeoutCh)
|
ensurePrecommitTimeout(precommitTimeoutCh)
|
||||||
@@ -1628,7 +1632,7 @@ func TestStartNextHeightCorrectlyAfterTimeout(t *testing.T) {
|
|||||||
ensureNewRound(newRoundCh, height, round+1)
|
ensureNewRound(newRoundCh, height, round+1)
|
||||||
|
|
||||||
// majority is now reached
|
// majority is now reached
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs4)
|
||||||
|
|
||||||
ensureNewBlockHeader(newBlockHeader, height, theBlockHash)
|
ensureNewBlockHeader(newBlockHeader, height, theBlockHash)
|
||||||
|
|
||||||
@@ -1643,10 +1647,10 @@ func TestStartNextHeightCorrectlyAfterTimeout(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestResetTimeoutPrecommitUponNewHeight(t *testing.T) {
|
func TestResetTimeoutPrecommitUponNewHeight(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
config.Consensus.SkipTimeoutCommit = false
|
config.Consensus.SkipTimeoutCommit = false
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
|
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
@@ -1674,15 +1678,15 @@ func TestResetTimeoutPrecommitUponNewHeight(t *testing.T) {
|
|||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
validatePrevote(t, cs1, round, vss[0], theBlockHash)
|
validatePrevote(t, cs1, round, vss[0], theBlockHash)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash)
|
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash)
|
||||||
|
|
||||||
// add precommits
|
// add precommits
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2)
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2)
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs3)
|
signAddVotes(config, cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs3)
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs4)
|
signAddVotes(config, cs1, tmproto.PrecommitType, theBlockHash, theBlockParts, vs4)
|
||||||
|
|
||||||
ensureNewBlockHeader(newBlockHeader, height, theBlockHash)
|
ensureNewBlockHeader(newBlockHeader, height, theBlockHash)
|
||||||
|
|
||||||
@@ -1787,9 +1791,9 @@ func TestStateSlashingPrecommits(t *testing.T) {
|
|||||||
// 4 vals.
|
// 4 vals.
|
||||||
// we receive a final precommit after going into next round, but others might have gone to commit already!
|
// we receive a final precommit after going into next round, but others might have gone to commit already!
|
||||||
func TestStateHalt1(t *testing.T) {
|
func TestStateHalt1(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs1, vss := randState(4)
|
cs1, vss := randState(config, 4)
|
||||||
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3]
|
||||||
height, round := cs1.Height, cs1.Round
|
height, round := cs1.Height, cs1.Round
|
||||||
partSize := types.BlockPartSizeBytes
|
partSize := types.BlockPartSizeBytes
|
||||||
@@ -1814,17 +1818,17 @@ func TestStateHalt1(t *testing.T) {
|
|||||||
|
|
||||||
ensurePrevote(voteCh, height, round)
|
ensurePrevote(voteCh, height, round)
|
||||||
|
|
||||||
signAddVotes(cs1, tmproto.PrevoteType, propBlock.Hash(), propBlockParts.Header(), vs2, vs3, vs4)
|
signAddVotes(config, cs1, tmproto.PrevoteType, propBlock.Hash(), propBlockParts.Header(), vs2, vs3, vs4)
|
||||||
|
|
||||||
ensurePrecommit(voteCh, height, round)
|
ensurePrecommit(voteCh, height, round)
|
||||||
// the proposed block should now be locked and our precommit added
|
// the proposed block should now be locked and our precommit added
|
||||||
validatePrecommit(t, cs1, round, round, vss[0], propBlock.Hash(), propBlock.Hash())
|
validatePrecommit(t, cs1, round, round, vss[0], propBlock.Hash(), propBlock.Hash())
|
||||||
|
|
||||||
// add precommits from the rest
|
// add precommits from the rest
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2) // didnt receive proposal
|
signAddVotes(config, cs1, tmproto.PrecommitType, nil, types.PartSetHeader{}, vs2) // didnt receive proposal
|
||||||
signAddVotes(cs1, tmproto.PrecommitType, propBlock.Hash(), propBlockParts.Header(), vs3)
|
signAddVotes(config, cs1, tmproto.PrecommitType, propBlock.Hash(), propBlockParts.Header(), vs3)
|
||||||
// we receive this later, but vs3 might receive it earlier and with ours will go to commit!
|
// we receive this later, but vs3 might receive it earlier and with ours will go to commit!
|
||||||
precommit4 := signVote(vs4, tmproto.PrecommitType, propBlock.Hash(), propBlockParts.Header())
|
precommit4 := signVote(vs4, config, tmproto.PrecommitType, propBlock.Hash(), propBlockParts.Header())
|
||||||
|
|
||||||
incrementRound(vs2, vs3, vs4)
|
incrementRound(vs2, vs3, vs4)
|
||||||
|
|
||||||
@@ -1856,10 +1860,10 @@ func TestStateHalt1(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestStateOutputsBlockPartsStats(t *testing.T) {
|
func TestStateOutputsBlockPartsStats(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
// create dummy peer
|
// create dummy peer
|
||||||
cs, _ := randState(1)
|
cs, _ := randState(config, 1)
|
||||||
peer := p2pmock.NewPeer(nil)
|
peer := p2pmock.NewPeer(nil)
|
||||||
|
|
||||||
// 1) new block part
|
// 1) new block part
|
||||||
@@ -1901,15 +1905,15 @@ func TestStateOutputsBlockPartsStats(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestStateOutputVoteStats(t *testing.T) {
|
func TestStateOutputVoteStats(t *testing.T) {
|
||||||
configSetup(t)
|
config := configSetup(t)
|
||||||
|
|
||||||
cs, vss := randState(2)
|
cs, vss := randState(config, 2)
|
||||||
// create dummy peer
|
// create dummy peer
|
||||||
peer := p2pmock.NewPeer(nil)
|
peer := p2pmock.NewPeer(nil)
|
||||||
|
|
||||||
randBytes := tmrand.Bytes(tmhash.Size)
|
randBytes := tmrand.Bytes(tmhash.Size)
|
||||||
|
|
||||||
vote := signVote(vss[1], tmproto.PrecommitType, randBytes, types.PartSetHeader{})
|
vote := signVote(vss[1], config, tmproto.PrecommitType, randBytes, types.PartSetHeader{})
|
||||||
|
|
||||||
voteMessage := &VoteMessage{vote}
|
voteMessage := &VoteMessage{vote}
|
||||||
cs.handleMsg(msgInfo{voteMessage, peer.ID()})
|
cs.handleMsg(msgInfo{voteMessage, peer.ID()})
|
||||||
@@ -1923,7 +1927,7 @@ func TestStateOutputVoteStats(t *testing.T) {
|
|||||||
|
|
||||||
// sending the vote for the bigger height
|
// sending the vote for the bigger height
|
||||||
incrementHeight(vss[1])
|
incrementHeight(vss[1])
|
||||||
vote = signVote(vss[1], tmproto.PrecommitType, randBytes, types.PartSetHeader{})
|
vote = signVote(vss[1], config, tmproto.PrecommitType, randBytes, types.PartSetHeader{})
|
||||||
|
|
||||||
cs.handleMsg(msgInfo{&VoteMessage{vote}, peer.ID()})
|
cs.handleMsg(msgInfo{&VoteMessage{vote}, peer.ID()})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user