aboutsummaryrefslogtreecommitdiffstats
path: root/core/syncer/agreement_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/syncer/agreement_test.go')
-rw-r--r--core/syncer/agreement_test.go110
1 files changed, 110 insertions, 0 deletions
diff --git a/core/syncer/agreement_test.go b/core/syncer/agreement_test.go
new file mode 100644
index 0000000..4e66f8b
--- /dev/null
+++ b/core/syncer/agreement_test.go
@@ -0,0 +1,110 @@
+// Copyright 2019 The dexon-consensus Authors
+// This file is part of the dexon-consensus library.
+//
+// The dexon-consensus 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 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 library. If not, see
+// <http://www.gnu.org/licenses/>.
+
+package syncer
+
+import (
+ "testing"
+ "time"
+
+ "github.com/dexon-foundation/dexon-consensus/common"
+ "github.com/dexon-foundation/dexon-consensus/core"
+ "github.com/dexon-foundation/dexon-consensus/core/crypto"
+ "github.com/dexon-foundation/dexon-consensus/core/test"
+ "github.com/dexon-foundation/dexon-consensus/core/types"
+ "github.com/dexon-foundation/dexon-consensus/core/utils"
+ "github.com/stretchr/testify/suite"
+)
+
+type AgreementTestSuite struct {
+ suite.Suite
+
+ signers []*utils.Signer
+ pubKeys []crypto.PublicKey
+ prvKeys []crypto.PrivateKey
+}
+
+func (s *AgreementTestSuite) SetupSuite() {
+ var err error
+ s.prvKeys, s.pubKeys, err = test.NewKeys(4)
+ s.Require().NoError(err)
+ for _, k := range s.prvKeys {
+ s.signers = append(s.signers, utils.NewSigner(k))
+ }
+}
+
+func (s *AgreementTestSuite) prepareAgreementResult(pos types.Position,
+ hash common.Hash) *types.AgreementResult {
+ votes := []types.Vote{}
+ for _, signer := range s.signers {
+ v := types.NewVote(types.VoteCom, hash, 0)
+ v.Position = pos
+ s.Require().NoError(signer.SignVote(v))
+ votes = append(votes, *v)
+ }
+ return &types.AgreementResult{
+ BlockHash: hash,
+ Position: pos,
+ Votes: votes,
+ }
+}
+
+func (s *AgreementTestSuite) prepareBlock(pos types.Position) *types.Block {
+ b := &types.Block{
+ Position: pos,
+ }
+ s.Require().NoError(s.signers[0].SignBlock(b))
+ return b
+}
+
+func (s *AgreementTestSuite) TestFutureAgreementResult() {
+ // Make sure future types.AgreementResult could be processed correctly
+ // when corresponding CRS is ready.
+ var (
+ futureRound = uint64(7)
+ pos = types.Position{Round: 7, Height: 1000}
+ )
+ gov, err := test.NewGovernance(
+ test.NewState(s.pubKeys, time.Second, &common.NullLogger{}, true),
+ core.ConfigRoundShift,
+ )
+ s.Require().NoError(err)
+ // Make sure goverance is ready for some future round, including CRS.
+ gov.CatchUpWithRound(futureRound)
+ for i := uint64(1); i <= futureRound; i++ {
+ gov.ProposeCRS(i, common.NewRandomHash().Bytes())
+ }
+ s.Require().NoError(err)
+ blockChan := make(chan *types.Block, 10)
+ agr := newAgreement(blockChan, make(chan common.Hash, 100),
+ utils.NewNodeSetCache(gov), &common.SimpleLogger{})
+ go agr.run()
+ block := s.prepareBlock(pos)
+ result := s.prepareAgreementResult(pos, block.Hash)
+ agr.inputChan <- result
+ agr.inputChan <- block
+ agr.inputChan <- futureRound
+ select {
+ case confirmedBlock := <-blockChan:
+ s.Require().Equal(block.Hash, confirmedBlock.Hash)
+ case <-time.After(2 * time.Second):
+ s.Require().True(false)
+ }
+}
+
+func TestAgreement(t *testing.T) {
+ suite.Run(t, new(AgreementTestSuite))
+}