|
|
@ -1279,6 +1279,71 @@ func TestCommitFromPreviousRound(t *testing.T) { |
|
|
|
ensureNewRound(newRoundCh, height+1, 0) |
|
|
|
} |
|
|
|
|
|
|
|
type fakeTxNotifier struct { |
|
|
|
ch chan struct{} |
|
|
|
} |
|
|
|
|
|
|
|
func (n *fakeTxNotifier) TxsAvailable() <-chan struct{} { |
|
|
|
return n.ch |
|
|
|
} |
|
|
|
|
|
|
|
func (n *fakeTxNotifier) Notify() { |
|
|
|
n.ch <- struct{}{} |
|
|
|
} |
|
|
|
|
|
|
|
func TestStartNextHeightCorrectly(t *testing.T) { |
|
|
|
cs1, vss := randConsensusState(4) |
|
|
|
cs1.config.SkipTimeoutCommit = false |
|
|
|
cs1.txNotifier = &fakeTxNotifier{ch: make(chan struct{})} |
|
|
|
|
|
|
|
vs2, vs3, vs4 := vss[1], vss[2], vss[3] |
|
|
|
height, round := cs1.Height, cs1.Round |
|
|
|
|
|
|
|
proposalCh := subscribe(cs1.eventBus, types.EventQueryCompleteProposal) |
|
|
|
timeoutProposeCh := subscribe(cs1.eventBus, types.EventQueryTimeoutPropose) |
|
|
|
|
|
|
|
newRoundCh := subscribe(cs1.eventBus, types.EventQueryNewRound) |
|
|
|
newBlockHeader := subscribe(cs1.eventBus, types.EventQueryNewBlockHeader) |
|
|
|
addr := cs1.privValidator.GetPubKey().Address() |
|
|
|
voteCh := subscribeToVoter(cs1, addr) |
|
|
|
|
|
|
|
// start round and wait for propose and prevote
|
|
|
|
startTestRound(cs1, height, round) |
|
|
|
ensureNewRound(newRoundCh, height, round) |
|
|
|
|
|
|
|
ensureNewProposal(proposalCh, height, round) |
|
|
|
rs := cs1.GetRoundState() |
|
|
|
theBlockHash := rs.ProposalBlock.Hash() |
|
|
|
theBlockParts := rs.ProposalBlockParts.Header() |
|
|
|
|
|
|
|
ensurePrevote(voteCh, height, round) |
|
|
|
validatePrevote(t, cs1, round, vss[0], theBlockHash) |
|
|
|
|
|
|
|
signAddVotes(cs1, types.PrevoteType, theBlockHash, theBlockParts, vs2, vs3, vs4) |
|
|
|
|
|
|
|
ensurePrecommit(voteCh, height, round) |
|
|
|
// the proposed block should now be locked and our precommit added
|
|
|
|
validatePrecommit(t, cs1, round, round, vss[0], theBlockHash, theBlockHash) |
|
|
|
|
|
|
|
rs = cs1.GetRoundState() |
|
|
|
|
|
|
|
// add precommits
|
|
|
|
signAddVotes(cs1, types.PrecommitType, nil, types.PartSetHeader{}, vs2) |
|
|
|
signAddVotes(cs1, types.PrecommitType, theBlockHash, theBlockParts, vs3) |
|
|
|
signAddVotes(cs1, types.PrecommitType, theBlockHash, theBlockParts, vs4) |
|
|
|
|
|
|
|
ensureNewBlockHeader(newBlockHeader, height, theBlockHash) |
|
|
|
|
|
|
|
rs = cs1.GetRoundState() |
|
|
|
assert.True(t, rs.TriggeredTimeoutPrecommit) |
|
|
|
|
|
|
|
cs1.txNotifier.(*fakeTxNotifier).Notify() |
|
|
|
|
|
|
|
ensureNewTimeout(timeoutProposeCh, height+1, round, cs1.config.TimeoutPropose.Nanoseconds()) |
|
|
|
rs = cs1.GetRoundState() |
|
|
|
assert.False(t, rs.TriggeredTimeoutPrecommit, "triggeredTimeoutPrecommit should be false at the beginning of each round") |
|
|
|
} |
|
|
|
|
|
|
|
//------------------------------------------------------------------------------------------
|
|
|
|
// SlashingSuite
|
|
|
|
// TODO: Slashing
|
|
|
|