aboutsummaryrefslogtreecommitdiffstats
path: root/core/leader-selector_test.go
diff options
context:
space:
mode:
authorJimmy Hu <jimmy.hu@dexon.org>2018-08-30 10:45:06 +0800
committerGitHub <noreply@github.com>2018-08-30 10:45:06 +0800
commit2681e011bd48ec107dedae9c7dcbc0810673298c (patch)
tree11dbe2b7ff285d3fa57d983e1103ccb61bfe122c /core/leader-selector_test.go
parentca3b30a62ff85090c1a721602e8b202e6ae9a2bd (diff)
downloaddexon-consensus-2681e011bd48ec107dedae9c7dcbc0810673298c.tar
dexon-consensus-2681e011bd48ec107dedae9c7dcbc0810673298c.tar.gz
dexon-consensus-2681e011bd48ec107dedae9c7dcbc0810673298c.tar.bz2
dexon-consensus-2681e011bd48ec107dedae9c7dcbc0810673298c.tar.lz
dexon-consensus-2681e011bd48ec107dedae9c7dcbc0810673298c.tar.xz
dexon-consensus-2681e011bd48ec107dedae9c7dcbc0810673298c.tar.zst
dexon-consensus-2681e011bd48ec107dedae9c7dcbc0810673298c.zip
core: Leader Selector. (#80)
Diffstat (limited to 'core/leader-selector_test.go')
-rw-r--r--core/leader-selector_test.go123
1 files changed, 123 insertions, 0 deletions
diff --git a/core/leader-selector_test.go b/core/leader-selector_test.go
new file mode 100644
index 0000000..f6028c0
--- /dev/null
+++ b/core/leader-selector_test.go
@@ -0,0 +1,123 @@
+// Copyright 2018 The dexon-consensus-core Authors
+// This file is part of the dexon-consensus-core library.
+//
+// The dexon-consensus-core library is free software: you can redistribute it
+// and/or modify it under the terms of the GNU Lesser General Public License as
+// published by the Free Software Foundation, either version 3 of the License,
+// or (at your option) any later version.
+//
+// The dexon-consensus-core library is distributed in the hope that it will be
+// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
+// General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the dexon-consensus-core library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+package core
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/suite"
+
+ "github.com/dexon-foundation/dexon-consensus-core/common"
+ "github.com/dexon-foundation/dexon-consensus-core/core/types"
+ "github.com/dexon-foundation/dexon-consensus-core/crypto/eth"
+)
+
+type LeaderSelectorTestSuite struct {
+ suite.Suite
+}
+
+func (s *LeaderSelectorTestSuite) newLeader() *leaderSelector {
+ return newGenesisLeaderSelector("DEXON 🚀", eth.SigToPub)
+}
+
+func (s *LeaderSelectorTestSuite) TestDistance() {
+ leader := s.newLeader()
+ hash := common.NewRandomHash()
+ prv, err := eth.NewPrivateKey()
+ s.Require().Nil(err)
+ sig, err := prv.Sign(hash)
+ s.Require().Nil(err)
+ dis := leader.distance(sig)
+ s.True(dis.Cmp(maxHash) == -1)
+}
+
+func (s *LeaderSelectorTestSuite) TestProbability() {
+ leader := s.newLeader()
+ prv1, err := eth.NewPrivateKey()
+ s.Require().Nil(err)
+ prv2, err := eth.NewPrivateKey()
+ s.Require().Nil(err)
+ for {
+ hash := common.NewRandomHash()
+ sig1, err := prv1.Sign(hash)
+ s.Require().Nil(err)
+ sig2, err := prv2.Sign(hash)
+ s.Require().Nil(err)
+ dis1 := leader.distance(sig1)
+ dis2 := leader.distance(sig2)
+ prob1 := leader.probability(sig1)
+ prob2 := leader.probability(sig2)
+ s.True(prob1 <= 1 && prob1 >= 0)
+ s.True(prob2 <= 1 && prob2 >= 0)
+ cmp := dis1.Cmp(dis2)
+ if cmp == 0 {
+ s.True(dis1.Cmp(dis2) == 0)
+ continue
+ }
+ if cmp == 1 {
+ s.True(prob2 > prob1)
+ } else if cmp == -1 {
+ s.True(prob2 < prob1)
+ }
+ break
+ }
+}
+
+func (s *LeaderSelectorTestSuite) TestLeaderBlockHash() {
+ leader := s.newLeader()
+ blocks := make(map[common.Hash]*types.Block)
+ for i := 0; i < 10; i++ {
+ prv, err := eth.NewPrivateKey()
+ s.Require().Nil(err)
+ block := &types.Block{
+ ProposerID: types.NewValidatorID(prv.PublicKey()),
+ Hash: common.NewRandomHash(),
+ }
+ s.Require().Nil(leader.prepareBlock(block, prv))
+ s.Require().Nil(leader.processBlock(block))
+ blocks[block.Hash] = block
+ }
+ blockHash := leader.leaderBlockHash()
+ leaderBlock, exist := blocks[blockHash]
+ s.Require().True(exist)
+ leaderDist := leader.distance(leaderBlock.CRSSignature)
+ for _, block := range blocks {
+ if block == leaderBlock {
+ continue
+ }
+ dist := leader.distance(block.CRSSignature)
+ s.True(leaderDist.Cmp(dist) == -1)
+ }
+}
+
+func (s *LeaderSelectorTestSuite) TestPrepareBlock() {
+ leader := s.newLeader()
+ prv, err := eth.NewPrivateKey()
+ s.Require().Nil(err)
+ block := &types.Block{
+ ProposerID: types.NewValidatorID(prv.PublicKey()),
+ }
+ s.Require().Nil(leader.prepareBlock(block, prv))
+ s.Nil(leader.processBlock(block))
+ block.Height++
+ s.Error(ErrIncorrectCRSSignature, leader.processBlock(block))
+}
+
+func TestLeaderSelector(t *testing.T) {
+ suite.Run(t, new(LeaderSelectorTestSuite))
+}