aboutsummaryrefslogtreecommitdiffstats
path: root/core/leader-selector_test.go
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2018-10-26 12:05:27 +0800
committerGitHub <noreply@github.com>2018-10-26 12:05:27 +0800
commitef0df0e6e27acd3852f2e0efdccf0798d5fc63ad (patch)
tree1e7f124d2fd13e9237e4731726845c16dd87a6b8 /core/leader-selector_test.go
parentfd175ba0843513d3966165441689d4e9a2c8d0bf (diff)
downloaddexon-consensus-ef0df0e6e27acd3852f2e0efdccf0798d5fc63ad.tar
dexon-consensus-ef0df0e6e27acd3852f2e0efdccf0798d5fc63ad.tar.gz
dexon-consensus-ef0df0e6e27acd3852f2e0efdccf0798d5fc63ad.tar.bz2
dexon-consensus-ef0df0e6e27acd3852f2e0efdccf0798d5fc63ad.tar.lz
dexon-consensus-ef0df0e6e27acd3852f2e0efdccf0798d5fc63ad.tar.xz
dexon-consensus-ef0df0e6e27acd3852f2e0efdccf0798d5fc63ad.tar.zst
dexon-consensus-ef0df0e6e27acd3852f2e0efdccf0798d5fc63ad.zip
core: Leader selector will retry sanityCheck (#261)
Diffstat (limited to 'core/leader-selector_test.go')
-rw-r--r--core/leader-selector_test.go64
1 files changed, 53 insertions, 11 deletions
diff --git a/core/leader-selector_test.go b/core/leader-selector_test.go
index e2f7070..0927fe0 100644
--- a/core/leader-selector_test.go
+++ b/core/leader-selector_test.go
@@ -29,35 +29,49 @@ import (
type LeaderSelectorTestSuite struct {
suite.Suite
+ mockValidLeaderDefault bool
+ mockValidLeaderDB map[common.Hash]bool
+ mockValidLeader validLeaderFn
+}
+
+func (s *LeaderSelectorTestSuite) SetupTest() {
+ s.mockValidLeaderDefault = true
+ s.mockValidLeaderDB = make(map[common.Hash]bool)
+ s.mockValidLeader = func(b *types.Block) bool {
+ if ret, exist := s.mockValidLeaderDB[b.Hash]; exist {
+ return ret
+ }
+ return s.mockValidLeaderDefault
+ }
}
func (s *LeaderSelectorTestSuite) newLeader() *leaderSelector {
- return newLeaderSelector(common.NewRandomHash())
+ return newLeaderSelector(common.NewRandomHash(), s.mockValidLeader)
}
func (s *LeaderSelectorTestSuite) TestDistance() {
leader := s.newLeader()
hash := common.NewRandomHash()
prv, err := ecdsa.NewPrivateKey()
- s.Require().Nil(err)
+ s.Require().NoError(err)
sig, err := prv.Sign(hash)
- s.Require().Nil(err)
+ s.Require().NoError(err)
dis := leader.distance(sig)
- s.True(dis.Cmp(maxHash) == -1)
+ s.Equal(-1, dis.Cmp(maxHash))
}
func (s *LeaderSelectorTestSuite) TestProbability() {
leader := s.newLeader()
prv1, err := ecdsa.NewPrivateKey()
- s.Require().Nil(err)
+ s.Require().NoError(err)
prv2, err := ecdsa.NewPrivateKey()
- s.Require().Nil(err)
+ s.Require().NoError(err)
for {
hash := common.NewRandomHash()
sig1, err := prv1.Sign(hash)
- s.Require().Nil(err)
+ s.Require().NoError(err)
sig2, err := prv2.Sign(hash)
- s.Require().Nil(err)
+ s.Require().NoError(err)
dis1 := leader.distance(sig1)
dis2 := leader.distance(sig2)
prob1 := leader.probability(sig1)
@@ -83,14 +97,14 @@ func (s *LeaderSelectorTestSuite) TestLeaderBlockHash() {
blocks := make(map[common.Hash]*types.Block)
for i := 0; i < 10; i++ {
prv, err := ecdsa.NewPrivateKey()
- s.Require().Nil(err)
+ s.Require().NoError(err)
block := &types.Block{
ProposerID: types.NewNodeID(prv.PublicKey()),
Hash: common.NewRandomHash(),
}
s.Require().NoError(
NewAuthenticator(prv).SignCRS(block, leader.hashCRS))
- s.Require().Nil(leader.processBlock(block))
+ s.Require().NoError(leader.processBlock(block))
blocks[block.Hash] = block
}
blockHash := leader.leaderBlockHash()
@@ -102,8 +116,36 @@ func (s *LeaderSelectorTestSuite) TestLeaderBlockHash() {
continue
}
dist := leader.distance(block.CRSSignature)
- s.True(leaderDist.Cmp(dist) == -1)
+ s.Equal(-1, leaderDist.Cmp(dist))
+ }
+}
+
+func (s *LeaderSelectorTestSuite) TestValidLeaderFn() {
+ leader := s.newLeader()
+ blocks := make(map[common.Hash]*types.Block)
+ for i := 0; i < 10; i++ {
+ prv, err := ecdsa.NewPrivateKey()
+ s.Require().NoError(err)
+ block := &types.Block{
+ ProposerID: types.NewNodeID(prv.PublicKey()),
+ Hash: common.NewRandomHash(),
+ }
+ s.Require().NoError(
+ NewAuthenticator(prv).SignCRS(block, leader.hashCRS))
+ s.Require().NoError(leader.processBlock(block))
+ blocks[block.Hash] = block
+ }
+ blockHash := leader.leaderBlockHash()
+
+ s.mockValidLeaderDB[blockHash] = false
+ leader.restart()
+ for _, b := range blocks {
+ s.Require().NoError(leader.processBlock(b))
}
+ s.NotEqual(blockHash, leader.leaderBlockHash())
+ s.mockValidLeaderDB[blockHash] = true
+ s.Equal(blockHash, leader.leaderBlockHash())
+ s.Len(leader.pendingBlocks, 0)
}
func TestLeaderSelector(t *testing.T) {