mirror of
https://github.com/fluencelabs/tendermint
synced 2025-05-29 14:11:21 +00:00
more tests
This commit is contained in:
parent
5787f78841
commit
4d54cced43
@ -238,7 +238,7 @@ func (pool *blockPool) getNextTwoBlocks() (first, second *blockData, err error)
|
|||||||
|
|
||||||
if err == errMissingBlocks {
|
if err == errMissingBlocks {
|
||||||
// We need both to sync the first block.
|
// We need both to sync the first block.
|
||||||
pool.logger.Error("missing first two blocks from height", "height", pool.height)
|
pool.logger.Error("missing blocks at height and/ or height+1", "height", pool.height)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -203,6 +203,7 @@ func (bcR *BlockchainReactor) sendRemovePeerToFSM(peerID p2p.ID) {
|
|||||||
event: peerRemoveEv,
|
event: peerRemoveEv,
|
||||||
data: bReactorEventData{
|
data: bReactorEventData{
|
||||||
peerId: peerID,
|
peerId: peerID,
|
||||||
|
err: errSwitchRemovesPeer,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
bcR.sendMessageToFSMAsync(msgData)
|
bcR.sendMessageToFSMAsync(msgData)
|
||||||
@ -315,8 +316,18 @@ ForLoop:
|
|||||||
}
|
}
|
||||||
_ = sendMessageToFSMSync(bcR.fsm, msgData)
|
_ = sendMessageToFSMSync(bcR.fsm, msgData)
|
||||||
|
|
||||||
case err := <-bcR.errorsFromFSMCh:
|
case msg := <-bcR.errorsFromFSMCh:
|
||||||
bcR.reportPeerErrorToSwitch(err.err, err.peerID)
|
bcR.reportPeerErrorToSwitch(msg.err, msg.peerID)
|
||||||
|
if msg.err == errNoPeerResponse {
|
||||||
|
msgData := bReactorMessageData{
|
||||||
|
event: peerRemoveEv,
|
||||||
|
data: bReactorEventData{
|
||||||
|
peerId: msg.peerID,
|
||||||
|
err: msg.err,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
_ = sendMessageToFSMSync(bcR.fsm, msgData)
|
||||||
|
}
|
||||||
|
|
||||||
case <-statusUpdateTicker.C:
|
case <-statusUpdateTicker.C:
|
||||||
// Ask for status updates.
|
// Ask for status updates.
|
||||||
|
@ -158,6 +158,7 @@ var (
|
|||||||
errPeerTooShort = errors.New("peer height too low, old peer removed/ new peer not added")
|
errPeerTooShort = errors.New("peer height too low, old peer removed/ new peer not added")
|
||||||
errSlowPeer = errors.New("peer is not sending us data fast enough")
|
errSlowPeer = errors.New("peer is not sending us data fast enough")
|
||||||
errNoPeerFoundForHeight = errors.New("could not find peer for block request")
|
errNoPeerFoundForHeight = errors.New("could not find peer for block request")
|
||||||
|
errSwitchRemovesPeer = errors.New("switch is removing peer")
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -71,6 +71,7 @@ type fsmStepTestValues struct {
|
|||||||
failBlockReq bool
|
failBlockReq bool
|
||||||
blockReqIncreased bool
|
blockReqIncreased bool
|
||||||
blocksAdded []int64
|
blocksAdded []int64
|
||||||
|
peersNotInPool []p2p.ID
|
||||||
|
|
||||||
expectedLastBlockReq *lastBlockRequestT
|
expectedLastBlockReq *lastBlockRequestT
|
||||||
}
|
}
|
||||||
@ -135,6 +136,18 @@ func waitForBlock_BlockRespEv_WantWaitForBlock(peerID p2p.ID, height int64, prev
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func waitForBlock_PeerRemoveEv_waitForBlock(peerID p2p.ID, err error, peerSet []p2p.ID) fsmStepTestValues {
|
||||||
|
return fsmStepTestValues{
|
||||||
|
currentState: "waitForBlock", event: peerRemoveEv,
|
||||||
|
data: bReactorEventData{
|
||||||
|
peerId: peerID,
|
||||||
|
err: err,
|
||||||
|
},
|
||||||
|
expectedState: "waitForBlock",
|
||||||
|
peersNotInPool: peerSet,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func newTestReactor(height int64) *testReactor {
|
func newTestReactor(height int64) *testReactor {
|
||||||
testBcR := &testReactor{logger: log.TestingLogger()}
|
testBcR := &testReactor{logger: log.TestingLogger()}
|
||||||
testBcR.fsm = NewFSM(height, testBcR)
|
testBcR.fsm = NewFSM(height, testBcR)
|
||||||
@ -264,14 +277,13 @@ func TestFSMBlockVerificationFailure(t *testing.T) {
|
|||||||
{
|
{
|
||||||
name: "block verification failure",
|
name: "block verification failure",
|
||||||
startingHeight: 1,
|
startingHeight: 1,
|
||||||
maxRequestsPerPeer: 2,
|
maxRequestsPerPeer: 3,
|
||||||
steps: []fsmStepTestValues{
|
steps: []fsmStepTestValues{
|
||||||
// startFSMEv
|
// startFSMEv
|
||||||
unknown_StartFSMEv_WantWaitForPeer,
|
unknown_StartFSMEv_WantWaitForPeer,
|
||||||
// statusResponseEv from P1
|
// statusResponseEv from P1
|
||||||
waitForPeer_StatusEv_WantWaitForBlock("P1", 3),
|
waitForPeer_StatusEv_WantWaitForBlock("P1", 3),
|
||||||
// statusResponseEv from P2
|
|
||||||
waitForBlock_StatusEv_WantWaitForBlock("P2", 3),
|
|
||||||
// makeRequestEv
|
// makeRequestEv
|
||||||
waitForBlock_MakeRequestEv_WantWaitForBlock(maxNumPendingRequests),
|
waitForBlock_MakeRequestEv_WantWaitForBlock(maxNumPendingRequests),
|
||||||
// blockResponseEv for height 1
|
// blockResponseEv for height 1
|
||||||
@ -279,7 +291,10 @@ func TestFSMBlockVerificationFailure(t *testing.T) {
|
|||||||
// blockResponseEv for height 2
|
// blockResponseEv for height 2
|
||||||
waitForBlock_BlockRespEv_WantWaitForBlock("P1", 2, []int64{1}),
|
waitForBlock_BlockRespEv_WantWaitForBlock("P1", 2, []int64{1}),
|
||||||
// blockResponseEv for height 3
|
// blockResponseEv for height 3
|
||||||
waitForBlock_BlockRespEv_WantWaitForBlock("P2", 3, []int64{1, 2}),
|
waitForBlock_BlockRespEv_WantWaitForBlock("P1", 3, []int64{1, 2}),
|
||||||
|
|
||||||
|
// statusResponseEv from P2
|
||||||
|
waitForBlock_StatusEv_WantWaitForBlock("P2", 3),
|
||||||
|
|
||||||
// processedBlockEv with Error
|
// processedBlockEv with Error
|
||||||
waitForBlock_ProcessedBlockEv_Err_WantWaitForBlock,
|
waitForBlock_ProcessedBlockEv_Err_WantWaitForBlock,
|
||||||
@ -287,9 +302,11 @@ func TestFSMBlockVerificationFailure(t *testing.T) {
|
|||||||
// makeRequestEv
|
// makeRequestEv
|
||||||
waitForBlock_MakeRequestEv_WantWaitForBlock(maxNumPendingRequests),
|
waitForBlock_MakeRequestEv_WantWaitForBlock(maxNumPendingRequests),
|
||||||
// blockResponseEv for height 1
|
// blockResponseEv for height 1
|
||||||
waitForBlock_BlockRespEv_WantWaitForBlock("P2", 1, []int64{3}),
|
waitForBlock_BlockRespEv_WantWaitForBlock("P2", 1, []int64{}),
|
||||||
// blockResponseEv for height 2
|
// blockResponseEv for height 2
|
||||||
waitForBlock_BlockRespEv_WantWaitForBlock("P2", 2, []int64{1, 3}),
|
waitForBlock_BlockRespEv_WantWaitForBlock("P2", 2, []int64{1}),
|
||||||
|
// blockResponseEv for height 2
|
||||||
|
waitForBlock_BlockRespEv_WantWaitForBlock("P2", 3, []int64{1, 2}),
|
||||||
|
|
||||||
waitForBlock_ProcessedBlockEv_WantWaitForBlock,
|
waitForBlock_ProcessedBlockEv_WantWaitForBlock,
|
||||||
waitForBlock_ProcessedBlockEv_WantFinished,
|
waitForBlock_ProcessedBlockEv_WantFinished,
|
||||||
@ -360,6 +377,68 @@ func TestFSMBlockVerificationFailure(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestFSMPeerRemoveEvent(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
startingHeight int64
|
||||||
|
maxRequestsPerPeer int32
|
||||||
|
steps []fsmStepTestValues
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "peer remove event with no blocks",
|
||||||
|
startingHeight: 1,
|
||||||
|
maxRequestsPerPeer: 3,
|
||||||
|
steps: []fsmStepTestValues{
|
||||||
|
// startFSMEv
|
||||||
|
unknown_StartFSMEv_WantWaitForPeer,
|
||||||
|
// statusResponseEv from P1
|
||||||
|
waitForPeer_StatusEv_WantWaitForBlock("P1", 3),
|
||||||
|
// statusResponseEv from P2
|
||||||
|
waitForBlock_StatusEv_WantWaitForBlock("P2", 3),
|
||||||
|
// statusResponseEv from P3
|
||||||
|
waitForBlock_StatusEv_WantWaitForBlock("P3", 3),
|
||||||
|
|
||||||
|
waitForBlock_PeerRemoveEv_waitForBlock("P2", errSwitchRemovesPeer, []p2p.ID{"P2"}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
// Create test reactor
|
||||||
|
testBcR := newTestReactor(tt.startingHeight)
|
||||||
|
resetTestValues()
|
||||||
|
|
||||||
|
if tt.maxRequestsPerPeer != 0 {
|
||||||
|
maxRequestsPerPeer = tt.maxRequestsPerPeer
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, step := range tt.steps {
|
||||||
|
assert.Equal(t, step.currentState, testBcR.fsm.state.name)
|
||||||
|
failSendStatusRequest = step.failStatusReq
|
||||||
|
failSendBlockRequest = step.failBlockReq
|
||||||
|
|
||||||
|
oldNumStatusRequests := numStatusRequests
|
||||||
|
|
||||||
|
fsmErr := sendEventToFSM(testBcR.fsm, step.event, step.data)
|
||||||
|
assert.Equal(t, step.errWanted, fsmErr)
|
||||||
|
|
||||||
|
if step.shouldSendStatusReq {
|
||||||
|
assert.Equal(t, oldNumStatusRequests+1, numStatusRequests)
|
||||||
|
} else {
|
||||||
|
assert.Equal(t, oldNumStatusRequests, numStatusRequests)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, peerID := range step.peersNotInPool {
|
||||||
|
_, ok := testBcR.fsm.pool.peers[peerID]
|
||||||
|
assert.False(t, ok)
|
||||||
|
}
|
||||||
|
assert.Equal(t, step.expectedState, testBcR.fsm.state.name)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
maxStartingHeightTest = 100
|
maxStartingHeightTest = 100
|
||||||
maxRequestsPerPeerTest = 40
|
maxRequestsPerPeerTest = 40
|
||||||
@ -531,7 +610,7 @@ func TestReactorFSMPeerTimeout(t *testing.T) {
|
|||||||
assert.Equal(t, 1, numStatusRequests)
|
assert.Equal(t, 1, numStatusRequests)
|
||||||
|
|
||||||
// Send a status response message to FSM
|
// Send a status response message to FSM
|
||||||
peerID := p2p.ID(cmn.RandStr(12))
|
peerID := p2p.ID("P1")
|
||||||
sendStatusResponse(fsm, peerID, 10)
|
sendStatusResponse(fsm, peerID, 10)
|
||||||
time.Sleep(5 * time.Millisecond)
|
time.Sleep(5 * time.Millisecond)
|
||||||
|
|
||||||
@ -547,6 +626,10 @@ func TestReactorFSMPeerTimeout(t *testing.T) {
|
|||||||
|
|
||||||
// let FSM timeout on the block response message
|
// let FSM timeout on the block response message
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
assert.Equal(t, peerID, lastPeerError.peerID)
|
||||||
|
assert.Equal(t, errNoPeerResponse, lastPeerError.err)
|
||||||
|
|
||||||
|
peerTimeout = 15 * time.Second
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user