From 9ff8f0cdc45a7b294ae71a28e7e205bb67e559cb Mon Sep 17 00:00:00 2001
From: Jimmy Hu <jimmy.hu@dexon.org>
Date: Fri, 18 Jan 2019 11:39:14 +0800
Subject: core: Fix stuffs (#422)

* core: reduce syncing ba msg

* core: fix checking period of agreement result
---
 core/utils_test.go | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

(limited to 'core/utils_test.go')

diff --git a/core/utils_test.go b/core/utils_test.go
index dd15607..5d61a48 100644
--- a/core/utils_test.go
+++ b/core/utils_test.go
@@ -19,8 +19,14 @@ package core
 
 import (
 	"testing"
+	"time"
 
 	"github.com/stretchr/testify/suite"
+
+	"github.com/dexon-foundation/dexon-consensus/common"
+	"github.com/dexon-foundation/dexon-consensus/core/test"
+	"github.com/dexon-foundation/dexon-consensus/core/types"
+	"github.com/dexon-foundation/dexon-consensus/core/utils"
 )
 
 type UtilsTestSuite struct {
@@ -39,6 +45,81 @@ func (s *UtilsTestSuite) TestRemoveFromSortedUint32Slice() {
 	s.Equal([]uint32{}, removeFromSortedUint32Slice([]uint32{}, 1))
 }
 
+func (s *UtilsTestSuite) TestVerifyAgreementResult() {
+	prvKeys, pubKeys, err := test.NewKeys(4)
+	s.Require().NoError(err)
+	gov, err := test.NewGovernance(test.NewState(
+		pubKeys, time.Second, &common.NullLogger{}, true), ConfigRoundShift)
+	s.Require().NoError(err)
+	cache := utils.NewNodeSetCache(gov)
+	hash := common.NewRandomHash()
+	signers := make([]*utils.Signer, 0, len(prvKeys))
+	for _, prvKey := range prvKeys {
+		signers = append(signers, utils.NewSigner(prvKey))
+	}
+	pos := types.Position{
+		Round:   0,
+		ChainID: 0,
+		Height:  20,
+	}
+	baResult := &types.AgreementResult{
+		BlockHash: hash,
+		Position:  pos,
+	}
+	for _, signer := range signers {
+		vote := types.NewVote(types.VoteCom, hash, 0)
+		vote.Position = pos
+		s.Require().NoError(signer.SignVote(vote))
+		baResult.Votes = append(baResult.Votes, *vote)
+	}
+	s.Require().NoError(VerifyAgreementResult(baResult, cache))
+
+	// Test negative case.
+	// All period should be the same.
+	baResult.Votes[1].Period++
+	s.Equal(ErrIncorrectVotePeriod, VerifyAgreementResult(baResult, cache))
+	baResult.Votes[1].Period--
+
+	// Blockhash should match the one in votes.
+	baResult.BlockHash = common.NewRandomHash()
+	s.Equal(ErrIncorrectVoteBlockHash, VerifyAgreementResult(baResult, cache))
+	baResult.BlockHash = hash
+
+	// Position should match.
+	baResult.Position.Height++
+	s.Equal(ErrIncorrectVotePosition, VerifyAgreementResult(baResult, cache))
+	baResult.Position = pos
+
+	// types.VotePreCom is not accepted in agreement result.
+	baResult.Votes[0].Type = types.VotePreCom
+	s.Equal(ErrIncorrectVoteType, VerifyAgreementResult(baResult, cache))
+	baResult.Votes[0].Type = types.VoteCom
+
+	// Vote type should be the same.
+	baResult.Votes[1].Type = types.VoteFast
+	s.Equal(ErrIncorrectVoteType, VerifyAgreementResult(baResult, cache))
+	baResult.Votes[1].Type = types.VoteCom
+
+	// Only vote proposed by notarySet is valid.
+	baResult.Votes[0].ProposerID = types.NodeID{Hash: common.NewRandomHash()}
+	s.Equal(ErrIncorrectVoteProposer, VerifyAgreementResult(baResult, cache))
+	baResult.Votes[0].ProposerID = types.NewNodeID(pubKeys[0])
+
+	// Vote shuold have valid signature.
+	baResult.Votes[0].Signature, err = prvKeys[0].Sign(common.NewRandomHash())
+	s.Require().NoError(err)
+	s.Equal(ErrIncorrectVoteSignature, VerifyAgreementResult(baResult, cache))
+	s.Require().NoError(signers[0].SignVote(&baResult.Votes[0]))
+
+	// Unique votes shuold be more than threshold.
+	baResult.Votes = baResult.Votes[:1]
+	s.Equal(ErrNotEnoughVotes, VerifyAgreementResult(baResult, cache))
+	for range signers {
+		baResult.Votes = append(baResult.Votes, baResult.Votes[0])
+	}
+	s.Equal(ErrNotEnoughVotes, VerifyAgreementResult(baResult, cache))
+}
+
 func TestUtils(t *testing.T) {
 	suite.Run(t, new(UtilsTestSuite))
 }
-- 
cgit