diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2019-01-18 11:39:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-18 11:39:14 +0800 |
commit | 9ff8f0cdc45a7b294ae71a28e7e205bb67e559cb (patch) | |
tree | 26fa5ba54878b52dc6c8bb610428cdb8b84baba7 /core/utils_test.go | |
parent | c5b303f4d143631fb565d4ec8ff3bcc609a4ffd3 (diff) | |
download | dexon-consensus-9ff8f0cdc45a7b294ae71a28e7e205bb67e559cb.tar.gz dexon-consensus-9ff8f0cdc45a7b294ae71a28e7e205bb67e559cb.tar.zst dexon-consensus-9ff8f0cdc45a7b294ae71a28e7e205bb67e559cb.zip |
core: Fix stuffs (#422)
* core: reduce syncing ba msg
* core: fix checking period of agreement result
Diffstat (limited to 'core/utils_test.go')
-rw-r--r-- | core/utils_test.go | 81 |
1 files changed, 81 insertions, 0 deletions
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)) } |