diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2018-08-30 10:45:06 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-30 10:45:06 +0800 |
commit | 2681e011bd48ec107dedae9c7dcbc0810673298c (patch) | |
tree | 11dbe2b7ff285d3fa57d983e1103ccb61bfe122c /core/leader-selector_test.go | |
parent | ca3b30a62ff85090c1a721602e8b202e6ae9a2bd (diff) | |
download | dexon-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.go | 123 |
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)) +} |