diff --git a/consensus/tests/proposed_block_test.go b/consensus/tests/proposed_block_test.go index ff87d76960..e166e121a7 100644 --- a/consensus/tests/proposed_block_test.go +++ b/consensus/tests/proposed_block_test.go @@ -11,7 +11,7 @@ import ( ) func TestProcessFirstV2BlockAndSendVoteMsg(t *testing.T) { - // Block 11 is the first v2 block with starting round of 0 + // Block 11 is the first v2 block with round of 1 blockchain, _, currentBlock, _, _ := PrepareXDCTestBlockChainForV2Engine(t, 11, params.TestXDPoSMockChainConfigWithV2Engine, 0) engineV2 := blockchain.Engine().(*XDPoS.XDPoS).EngineV2 @@ -33,7 +33,8 @@ func TestProcessFirstV2BlockAndSendVoteMsg(t *testing.T) { round, _, highestQC, _ := engineV2.GetProperties() // Shoud trigger setNewRound assert.Equal(t, utils.Round(1), round) - assert.Equal(t, extraField.QuorumCert.Signatures, highestQC.Signatures) + // Should not update the highestQC + assert.Equal(t, utils.Round(0), highestQC.ProposedBlockInfo.Round) } diff --git a/consensus/tests/sync_info_test.go b/consensus/tests/sync_info_test.go index f9cb2cb8fa..51a125707a 100644 --- a/consensus/tests/sync_info_test.go +++ b/consensus/tests/sync_info_test.go @@ -6,11 +6,12 @@ import ( "github.com/XinFinOrg/XDPoSChain/consensus/XDPoS" "github.com/XinFinOrg/XDPoSChain/consensus/XDPoS/utils" "github.com/XinFinOrg/XDPoSChain/params" + "github.com/stretchr/testify/assert" ) -func TestSyncInfoForFirstV2BlockMsgWithoutQC(t *testing.T) { +func TestSyncInfoShouldSuccessfullyUpdateByQC(t *testing.T) { // Block 11 is the first v2 block with starting round of 0 - blockchain, _, currentBlock, _, _ := PrepareXDCTestBlockChainForV2Engine(t, 11, params.TestXDPoSMockChainConfigWithV2Engine, 0) + blockchain, _, currentBlock, _, _ := PrepareXDCTestBlockChainForV2Engine(t, 15, params.TestXDPoSMockChainConfigWithV2Engine, 0) engineV2 := blockchain.Engine().(*XDPoS.XDPoS).EngineV2 var extraField utils.ExtraFields_v2 @@ -20,12 +21,49 @@ func TestSyncInfoForFirstV2BlockMsgWithoutQC(t *testing.T) { } syncInfoMsg := &utils.SyncInfo{ - HighestQuorumCert: extraField.QuorumCert, - HighestTimeoutCert: nil, // Initial value? + HighestQuorumCert: extraField.QuorumCert, + HighestTimeoutCert: &utils.TimeoutCert{ + Round: utils.Round(2), + Signatures: []utils.Signature{}, + }, } err = engineV2.SyncInfoHandler(blockchain, syncInfoMsg) if err != nil { t.Fatal(err) } + round, _, highestQuorumCert, _ := engineV2.GetProperties() + // QC is parent block's qc, which is pointing at round 4, hence 4 + 1 = 5 + assert.Equal(t, utils.Round(5), round) + assert.Equal(t, extraField.QuorumCert, highestQuorumCert) +} + +func TestSyncInfoShouldSuccessfullyUpdateByTC(t *testing.T) { + // Block 11 is the first v2 block with starting round of 0 + blockchain, _, currentBlock, _, _ := PrepareXDCTestBlockChainForV2Engine(t, 15, params.TestXDPoSMockChainConfigWithV2Engine, 0) + engineV2 := blockchain.Engine().(*XDPoS.XDPoS).EngineV2 + + var extraField utils.ExtraFields_v2 + err := utils.DecodeBytesExtraFields(currentBlock.Extra(), &extraField) + if err != nil { + t.Fatal("Fail to decode extra data", err) + } + + highestTC := &utils.TimeoutCert{ + Round: utils.Round(6), + Signatures: []utils.Signature{}, + } + + syncInfoMsg := &utils.SyncInfo{ + HighestQuorumCert: extraField.QuorumCert, + HighestTimeoutCert: highestTC, + } + + err = engineV2.SyncInfoHandler(blockchain, syncInfoMsg) + if err != nil { + t.Fatal(err) + } + round, _, highestQuorumCert, _ := engineV2.GetProperties() + assert.Equal(t, utils.Round(7), round) + assert.Equal(t, extraField.QuorumCert, highestQuorumCert) } diff --git a/consensus/tests/timeout_test.go b/consensus/tests/timeout_test.go index b92aa62166..bac2df4d7d 100644 --- a/consensus/tests/timeout_test.go +++ b/consensus/tests/timeout_test.go @@ -51,7 +51,7 @@ func TestTimeoutMessageHandlerSuccessfullyGenerateTCandSyncInfo(t *testing.T) { // Shouldn't have QC, however, we did not inilise it, hence will show default empty value qc := syncInfoMsg.(*utils.SyncInfo).HighestQuorumCert - assert.Nil(t, qc) + assert.Equal(t, utils.Round(0), qc.ProposedBlockInfo.Round) tc := syncInfoMsg.(*utils.SyncInfo).HighestTimeoutCert assert.NotNil(t, tc) diff --git a/consensus/tests/vote_test.go b/consensus/tests/vote_test.go index 785712a0d3..40c20748ae 100644 --- a/consensus/tests/vote_test.go +++ b/consensus/tests/vote_test.go @@ -35,7 +35,7 @@ func TestVoteMessageHandlerSuccessfullyGeneratedAndProcessQCForFistV2Round(t *te currentRound, lockQuorumCert, highestQuorumCert, _ := engineV2.GetProperties() // initialised with nil and 0 round assert.Nil(t, lockQuorumCert) - assert.Nil(t, highestQuorumCert) + assert.Equal(t, utils.Round(0), highestQuorumCert.ProposedBlockInfo.Round) assert.Equal(t, utils.Round(1), currentRound) voteMsg = &utils.Vote{ ProposedBlockInfo: blockInfo, @@ -46,7 +46,7 @@ func TestVoteMessageHandlerSuccessfullyGeneratedAndProcessQCForFistV2Round(t *te currentRound, lockQuorumCert, highestQuorumCert, _ = engineV2.GetProperties() // Still using the initlised value because we did not yet go to the next round assert.Nil(t, lockQuorumCert) - assert.Nil(t, highestQuorumCert) + assert.Equal(t, utils.Round(0), highestQuorumCert.ProposedBlockInfo.Round) assert.Equal(t, utils.Round(1), currentRound) @@ -63,7 +63,7 @@ func TestVoteMessageHandlerSuccessfullyGeneratedAndProcessQCForFistV2Round(t *te assert.Equal(t, utils.Round(0), lockQuorumCert.ProposedBlockInfo.Round) // The highestQC proposedBlockInfo shall be the same as the one from its votes assert.Equal(t, highestQuorumCert.ProposedBlockInfo, voteMsg.ProposedBlockInfo) - // Check round has now changed from 5 to 6 + // Check round has now changed from 1 to 2 assert.Equal(t, utils.Round(2), currentRound) } @@ -90,7 +90,7 @@ func TestVoteMessageHandlerSuccessfullyGeneratedAndProcessQC(t *testing.T) { currentRound, lockQuorumCert, highestQuorumCert, _ := engineV2.GetProperties() // initialised with nil and 0 round assert.Nil(t, lockQuorumCert) - assert.Nil(t, highestQuorumCert) + assert.Equal(t, utils.Round(0), highestQuorumCert.ProposedBlockInfo.Round) assert.Equal(t, utils.Round(5), currentRound) voteMsg = &utils.Vote{ ProposedBlockInfo: blockInfo, @@ -101,7 +101,7 @@ func TestVoteMessageHandlerSuccessfullyGeneratedAndProcessQC(t *testing.T) { currentRound, lockQuorumCert, highestQuorumCert, _ = engineV2.GetProperties() // Still using the initlised value because we did not yet go to the next round assert.Nil(t, lockQuorumCert) - assert.Nil(t, highestQuorumCert) + assert.Equal(t, utils.Round(0), highestQuorumCert.ProposedBlockInfo.Round) assert.Equal(t, utils.Round(5), currentRound) @@ -176,7 +176,7 @@ func TestProcessVoteMsgThenTimeoutMsg(t *testing.T) { currentRound, lockQuorumCert, highestQuorumCert, _ := engineV2.GetProperties() // initialised with nil and 0 round assert.Nil(t, lockQuorumCert) - assert.Nil(t, highestQuorumCert) + assert.Equal(t, utils.Round(0), highestQuorumCert.ProposedBlockInfo.Round) assert.Equal(t, utils.Round(5), currentRound) voteMsg = &utils.Vote{