|
package v2
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/tendermint/tendermint/p2p"
|
|
)
|
|
|
|
func TestScheduleInit(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
sc = newSchedule(initHeight)
|
|
)
|
|
|
|
assert.Equal(t, blockStateNew, sc.getStateAtHeight(initHeight))
|
|
assert.Equal(t, blockStateProcessed, sc.getStateAtHeight(initHeight-1))
|
|
assert.Equal(t, blockStateUnknown, sc.getStateAtHeight(initHeight+1))
|
|
}
|
|
|
|
func TestAddPeer(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
peerID p2p.ID = "1"
|
|
peerIDTwo p2p.ID = "2"
|
|
sc = newSchedule(initHeight)
|
|
)
|
|
|
|
assert.Nil(t, sc.addPeer(peerID))
|
|
assert.Nil(t, sc.addPeer(peerIDTwo))
|
|
assert.Error(t, sc.addPeer(peerID))
|
|
}
|
|
|
|
func TestTouchPeer(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
peerID p2p.ID = "1"
|
|
sc = newSchedule(initHeight)
|
|
now = time.Now()
|
|
)
|
|
|
|
assert.Error(t, sc.touchPeer(peerID, now),
|
|
"Touching an unknown peer should return errPeerNotFound")
|
|
|
|
assert.Nil(t, sc.addPeer(peerID),
|
|
"Adding a peer should return no error")
|
|
assert.Nil(t, sc.touchPeer(peerID, now),
|
|
"Touching a peer should return no error")
|
|
|
|
threshold := 10 * time.Second
|
|
assert.Empty(t, sc.peersInactiveSince(threshold, now.Add(9*time.Second)),
|
|
"Expected no peers to have been touched over 9 seconds")
|
|
assert.Containsf(t, sc.peersInactiveSince(threshold, now.Add(11*time.Second)), peerID,
|
|
"Expected one %s to have been touched over 10 seconds ago", peerID)
|
|
}
|
|
|
|
func TestPeerHeight(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
peerID p2p.ID = "1"
|
|
peerHeight int64 = 20
|
|
sc = newSchedule(initHeight)
|
|
)
|
|
|
|
assert.NoError(t, sc.addPeer(peerID),
|
|
"Adding a peer should return no error")
|
|
assert.NoError(t, sc.setPeerHeight(peerID, peerHeight))
|
|
for i := initHeight; i <= peerHeight; i++ {
|
|
assert.Equal(t, sc.getStateAtHeight(i), blockStateNew,
|
|
"Expected all blocks to be in blockStateNew")
|
|
peerIDs := []p2p.ID{}
|
|
for _, peer := range sc.getPeersAtHeight(i) {
|
|
peerIDs = append(peerIDs, peer.peerID)
|
|
}
|
|
|
|
assert.Containsf(t, peerIDs, peerID,
|
|
"Expected %s to have block %d", peerID, i)
|
|
}
|
|
}
|
|
|
|
func TestTransitionPending(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
peerID p2p.ID = "1"
|
|
peerIDTwo p2p.ID = "2"
|
|
peerHeight int64 = 20
|
|
sc = newSchedule(initHeight)
|
|
now = time.Now()
|
|
)
|
|
|
|
assert.NoError(t, sc.addPeer(peerID),
|
|
"Adding a peer should return no error")
|
|
assert.Nil(t, sc.addPeer(peerIDTwo),
|
|
"Adding a peer should return no error")
|
|
|
|
assert.Error(t, sc.markPending(peerID, peerHeight, now),
|
|
"Expected scheduling a block from a peer in peerStateNew to fail")
|
|
|
|
assert.NoError(t, sc.setPeerHeight(peerID, peerHeight),
|
|
"Expected setPeerHeight to return no error")
|
|
assert.NoError(t, sc.setPeerHeight(peerIDTwo, peerHeight),
|
|
"Expected setPeerHeight to return no error")
|
|
|
|
assert.NoError(t, sc.markPending(peerID, peerHeight, now),
|
|
"Expected markingPending new block to succeed")
|
|
assert.Error(t, sc.markPending(peerIDTwo, peerHeight, now),
|
|
"Expected markingPending by a second peer to fail")
|
|
|
|
assert.Equal(t, blockStatePending, sc.getStateAtHeight(peerHeight),
|
|
"Expected the block to to be in blockStatePending")
|
|
|
|
assert.NoError(t, sc.removePeer(peerID),
|
|
"Expected removePeer to return no error")
|
|
|
|
assert.Equal(t, blockStateNew, sc.getStateAtHeight(peerHeight),
|
|
"Expected the block to to be in blockStateNew")
|
|
|
|
assert.Error(t, sc.markPending(peerID, peerHeight, now),
|
|
"Expected markingPending removed peer to fail")
|
|
|
|
assert.NoError(t, sc.markPending(peerIDTwo, peerHeight, now),
|
|
"Expected markingPending on a ready peer to succeed")
|
|
|
|
assert.Equal(t, blockStatePending, sc.getStateAtHeight(peerHeight),
|
|
"Expected the block to to be in blockStatePending")
|
|
}
|
|
|
|
func TestTransitionReceived(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
peerID p2p.ID = "1"
|
|
peerIDTwo p2p.ID = "2"
|
|
peerHeight int64 = 20
|
|
blockSize int64 = 1024
|
|
sc = newSchedule(initHeight)
|
|
now = time.Now()
|
|
receivedAt = now.Add(1 * time.Second)
|
|
)
|
|
|
|
assert.NoError(t, sc.addPeer(peerID),
|
|
"Expected adding peer %s to succeed", peerID)
|
|
assert.NoError(t, sc.addPeer(peerIDTwo),
|
|
"Expected adding peer %s to succeed", peerIDTwo)
|
|
assert.NoError(t, sc.setPeerHeight(peerID, peerHeight),
|
|
"Expected setPeerHeight to return no error")
|
|
assert.NoErrorf(t, sc.setPeerHeight(peerIDTwo, peerHeight),
|
|
"Expected setPeerHeight on %s to %d to succeed", peerIDTwo, peerHeight)
|
|
assert.NoError(t, sc.markPending(peerID, initHeight, now),
|
|
"Expected markingPending new block to succeed")
|
|
|
|
assert.Error(t, sc.markReceived(peerIDTwo, initHeight, blockSize, receivedAt),
|
|
"Expected marking markReceived from a non requesting peer to fail")
|
|
|
|
assert.NoError(t, sc.markReceived(peerID, initHeight, blockSize, receivedAt),
|
|
"Expected marking markReceived on a pending block to succeed")
|
|
|
|
assert.Error(t, sc.markReceived(peerID, initHeight, blockSize, receivedAt),
|
|
"Expected marking markReceived on received block to fail")
|
|
|
|
assert.Equalf(t, blockStateReceived, sc.getStateAtHeight(initHeight),
|
|
"Expected block %d to be blockHeightReceived", initHeight)
|
|
|
|
assert.NoErrorf(t, sc.removePeer(peerID),
|
|
"Expected removePeer removing %s to succeed", peerID)
|
|
|
|
assert.Equalf(t, blockStateNew, sc.getStateAtHeight(initHeight),
|
|
"Expected block %d to be blockStateNew", initHeight)
|
|
|
|
assert.NoErrorf(t, sc.markPending(peerIDTwo, initHeight, now),
|
|
"Expected markingPending %d from %s to succeed", initHeight, peerIDTwo)
|
|
assert.NoErrorf(t, sc.markReceived(peerIDTwo, initHeight, blockSize, receivedAt),
|
|
"Expected marking markReceived %d from %s to succeed", initHeight, peerIDTwo)
|
|
assert.Equalf(t, blockStateReceived, sc.getStateAtHeight(initHeight),
|
|
"Expected block %d to be blockStateReceived", initHeight)
|
|
}
|
|
|
|
func TestTransitionProcessed(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
peerID p2p.ID = "1"
|
|
peerHeight int64 = 20
|
|
blockSize int64 = 1024
|
|
sc = newSchedule(initHeight)
|
|
now = time.Now()
|
|
receivedAt = now.Add(1 * time.Second)
|
|
)
|
|
|
|
assert.NoError(t, sc.addPeer(peerID),
|
|
"Expected adding peer %s to succeed", peerID)
|
|
assert.NoErrorf(t, sc.setPeerHeight(peerID, peerHeight),
|
|
"Expected setPeerHeight on %s to %d to succeed", peerID, peerHeight)
|
|
assert.NoError(t, sc.markPending(peerID, initHeight, now),
|
|
"Expected markingPending new block to succeed")
|
|
assert.NoError(t, sc.markReceived(peerID, initHeight, blockSize, receivedAt),
|
|
"Expected marking markReceived on a pending block to succeed")
|
|
|
|
assert.Error(t, sc.markProcessed(initHeight+1),
|
|
"Expected marking %d as processed to fail", initHeight+1)
|
|
assert.NoError(t, sc.markProcessed(initHeight),
|
|
"Expected marking %d as processed to succeed", initHeight)
|
|
|
|
assert.Equalf(t, blockStateProcessed, sc.getStateAtHeight(initHeight),
|
|
"Expected block %d to be blockStateProcessed", initHeight)
|
|
|
|
assert.NoError(t, sc.removePeer(peerID),
|
|
"Expected removing peer %s to succeed", peerID)
|
|
|
|
assert.Equalf(t, blockStateProcessed, sc.getStateAtHeight(initHeight),
|
|
"Expected block %d to be blockStateProcessed", initHeight)
|
|
}
|
|
|
|
func TestMinMaxHeight(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
peerID p2p.ID = "1"
|
|
peerHeight int64 = 20
|
|
sc = newSchedule(initHeight)
|
|
now = time.Now()
|
|
)
|
|
|
|
assert.Equal(t, initHeight, sc.minHeight(),
|
|
"Expected min height to be the initialized height")
|
|
|
|
assert.Equal(t, initHeight, sc.maxHeight(),
|
|
"Expected max height to be the initialized height")
|
|
|
|
assert.NoError(t, sc.addPeer(peerID),
|
|
"Adding a peer should return no error")
|
|
|
|
assert.NoError(t, sc.setPeerHeight(peerID, peerHeight),
|
|
"Expected setPeerHeight to return no error")
|
|
|
|
assert.Equal(t, peerHeight, sc.maxHeight(),
|
|
"Expected max height to increase to peerHeight")
|
|
|
|
assert.Nil(t, sc.markPending(peerID, initHeight, now.Add(1*time.Second)),
|
|
"Expected marking initHeight as pending to return no error")
|
|
|
|
assert.Equal(t, initHeight+1, sc.minHeight(),
|
|
"Expected marking initHeight as pending to move minHeight forward")
|
|
}
|
|
|
|
func TestPeersSlowerThan(t *testing.T) {
|
|
var (
|
|
initHeight int64 = 5
|
|
peerID p2p.ID = "1"
|
|
peerHeight int64 = 20
|
|
blockSize int64 = 1024
|
|
sc = newSchedule(initHeight)
|
|
now = time.Now()
|
|
receivedAt = now.Add(1 * time.Second)
|
|
)
|
|
|
|
assert.NoError(t, sc.addPeer(peerID),
|
|
"Adding a peer should return no error")
|
|
|
|
assert.NoError(t, sc.setPeerHeight(peerID, peerHeight),
|
|
"Expected setPeerHeight to return no error")
|
|
|
|
assert.NoError(t, sc.markPending(peerID, peerHeight, now),
|
|
"Expected markingPending on to return no error")
|
|
|
|
assert.NoError(t, sc.markReceived(peerID, peerHeight, blockSize, receivedAt),
|
|
"Expected markingPending on to return no error")
|
|
|
|
assert.Empty(t, sc.peersSlowerThan(blockSize-1),
|
|
"expected no peers to be slower than blockSize-1 bytes/sec")
|
|
|
|
assert.Containsf(t, sc.peersSlowerThan(blockSize+1), peerID,
|
|
"expected %s to be slower than blockSize+1 bytes/sec", peerID)
|
|
}
|