@@ -31,6 +31,7 @@ import (
3131 "github.com/multiversx/mx-chain-go/process/mock"
3232 "github.com/multiversx/mx-chain-go/testscommon"
3333 dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever"
34+ "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock"
3435 "github.com/multiversx/mx-chain-go/testscommon/mbSelection"
3536 "github.com/multiversx/mx-chain-go/testscommon/pool"
3637 "github.com/multiversx/mx-chain-go/testscommon/processMocks"
@@ -1788,7 +1789,8 @@ func Test_checkShardHeadersValidityAndFinalityProposal(t *testing.T) {
17881789 dataPoolMock .SetHeadersPool (headersPoolMock )
17891790
17901791 mp , err := blproc .ConstructPartialMetaBlockProcessorForTest (map [string ]interface {}{
1791- "shardCoordinator" : mock .NewOneShardCoordinatorMock (),
1792+ "shardCoordinator" : mock .NewOneShardCoordinatorMock (),
1793+ "enableEpochsHandler" : & enableEpochsHandlerMock.EnableEpochsHandlerStub {},
17921794 "blockTracker" : & mock.BlockTrackerMock {
17931795 GetLastCrossNotarizedHeaderCalled : func (_ uint32 ) (data.HeaderHandler , []byte , error ) {
17941796 return & testscommon.HeaderHandlerStub {}, nil , nil
@@ -1905,7 +1907,8 @@ func Test_checkShardHeadersValidityAndFinalityProposal(t *testing.T) {
19051907 }
19061908
19071909 mp , err := blproc .ConstructPartialMetaBlockProcessorForTest (map [string ]interface {}{
1908- "shardCoordinator" : mock .NewOneShardCoordinatorMock (),
1910+ "shardCoordinator" : mock .NewOneShardCoordinatorMock (),
1911+ "enableEpochsHandler" : & enableEpochsHandlerMock.EnableEpochsHandlerStub {},
19091912 "blockTracker" : & mock.BlockTrackerMock {
19101913 GetLastCrossNotarizedHeaderCalled : func (_ uint32 ) (data.HeaderHandler , []byte , error ) {
19111914 return & testscommon.HeaderHandlerStub {}, nil , nil
@@ -1950,7 +1953,8 @@ func Test_checkShardHeadersValidityAndFinalityProposal(t *testing.T) {
19501953 dataPoolMock .SetHeadersPool (headersPoolMock )
19511954
19521955 mp , err := blproc .ConstructPartialMetaBlockProcessorForTest (map [string ]interface {}{
1953- "shardCoordinator" : mock .NewOneShardCoordinatorMock (),
1956+ "shardCoordinator" : mock .NewOneShardCoordinatorMock (),
1957+ "enableEpochsHandler" : & enableEpochsHandlerMock.EnableEpochsHandlerStub {},
19541958 "blockTracker" : & mock.BlockTrackerMock {
19551959 GetLastCrossNotarizedHeaderCalled : func (_ uint32 ) (data.HeaderHandler , []byte , error ) {
19561960 return & testscommon.HeaderHandlerStub {}, nil , nil
@@ -3583,7 +3587,8 @@ func TestMetaProcessor_checkHeadersSequenceCorrectness(t *testing.T) {
35833587 return expectedErr
35843588 },
35853589 },
3586- "blockTracker" : & integrationTestsMock.BlockTrackerStub {},
3590+ "enableEpochsHandler" : & enableEpochsHandlerMock.EnableEpochsHandlerStub {},
3591+ "blockTracker" : & integrationTestsMock.BlockTrackerStub {},
35873592 })
35883593 require .Nil (t , err )
35893594
@@ -3622,6 +3627,108 @@ func TestMetaProcessor_checkHeadersSequenceCorrectness(t *testing.T) {
36223627 require .ErrorContains (t , err , "included quarantined header" )
36233628 })
36243629
3630+ t .Run ("should return error for contended unsettled header" , func (t * testing.T ) {
3631+ t .Parallel ()
3632+
3633+ contendedHash := []byte ("contended hash" )
3634+ mp , err := blproc .ConstructPartialMetaBlockProcessorForTest (map [string ]interface {}{
3635+ "headerValidator" : & processMocks.HeaderValidatorMock {
3636+ IsHeaderConstructionValidCalled : func (currHdr , prevHdr data.HeaderHandler ) error {
3637+ return nil
3638+ },
3639+ },
3640+ "enableEpochsHandler" : & enableEpochsHandlerMock.EnableEpochsHandlerStub {
3641+ IsFlagEnabledCalled : func (flag core.EnableEpochFlag ) bool {
3642+ return flag == common .SupernovaFlag
3643+ },
3644+ },
3645+ "blockTracker" : & integrationTestsMock.BlockTrackerStub {
3646+ IsSettledCrossHeaderCalled : func (header data.HeaderHandler , headerHash []byte ) bool {
3647+ return false
3648+ },
3649+ },
3650+ })
3651+ require .Nil (t , err )
3652+
3653+ err = mp .CheckHeadersSequenceCorrectness ([]blproc.ShardHeaderInfo {
3654+ {
3655+ // rounds 2-4 skipped after the last notarized shard header
3656+ Header : & block.Header {Nonce : 2 , Round : 5 },
3657+ Hash : contendedHash ,
3658+ },
3659+ }, blproc.ShardHeaderInfo {
3660+ Header : & block.Header {Nonce : 1 , Round : 1 },
3661+ })
3662+ require .ErrorContains (t , err , "included contended header not yet settled" )
3663+ })
3664+
3665+ t .Run ("should work for contended settled header" , func (t * testing.T ) {
3666+ t .Parallel ()
3667+
3668+ mp , err := blproc .ConstructPartialMetaBlockProcessorForTest (map [string ]interface {}{
3669+ "headerValidator" : & processMocks.HeaderValidatorMock {
3670+ IsHeaderConstructionValidCalled : func (currHdr , prevHdr data.HeaderHandler ) error {
3671+ return nil
3672+ },
3673+ },
3674+ "enableEpochsHandler" : & enableEpochsHandlerMock.EnableEpochsHandlerStub {
3675+ IsFlagEnabledCalled : func (flag core.EnableEpochFlag ) bool {
3676+ return flag == common .SupernovaFlag
3677+ },
3678+ },
3679+ "blockTracker" : & integrationTestsMock.BlockTrackerStub {
3680+ IsSettledCrossHeaderCalled : func (header data.HeaderHandler , headerHash []byte ) bool {
3681+ return true
3682+ },
3683+ },
3684+ })
3685+ require .Nil (t , err )
3686+
3687+ err = mp .CheckHeadersSequenceCorrectness ([]blproc.ShardHeaderInfo {
3688+ {
3689+ Header : & block.Header {Nonce : 2 , Round : 5 },
3690+ Hash : []byte ("contended settled hash" ),
3691+ },
3692+ }, blproc.ShardHeaderInfo {
3693+ Header : & block.Header {Nonce : 1 , Round : 1 },
3694+ })
3695+ require .Nil (t , err )
3696+ })
3697+
3698+ t .Run ("should work for non-contended header without settlement lookup" , func (t * testing.T ) {
3699+ t .Parallel ()
3700+
3701+ mp , err := blproc .ConstructPartialMetaBlockProcessorForTest (map [string ]interface {}{
3702+ "headerValidator" : & processMocks.HeaderValidatorMock {
3703+ IsHeaderConstructionValidCalled : func (currHdr , prevHdr data.HeaderHandler ) error {
3704+ return nil
3705+ },
3706+ },
3707+ "enableEpochsHandler" : & enableEpochsHandlerMock.EnableEpochsHandlerStub {
3708+ IsFlagEnabledCalled : func (flag core.EnableEpochFlag ) bool {
3709+ return flag == common .SupernovaFlag
3710+ },
3711+ },
3712+ "blockTracker" : & integrationTestsMock.BlockTrackerStub {
3713+ IsSettledCrossHeaderCalled : func (header data.HeaderHandler , headerHash []byte ) bool {
3714+ require .Fail (t , "settlement must not be checked on the clean path" )
3715+ return false
3716+ },
3717+ },
3718+ })
3719+ require .Nil (t , err )
3720+
3721+ err = mp .CheckHeadersSequenceCorrectness ([]blproc.ShardHeaderInfo {
3722+ {
3723+ Header : & block.Header {Nonce : 2 , Round : 2 },
3724+ Hash : []byte ("clean hash" ),
3725+ },
3726+ }, blproc.ShardHeaderInfo {
3727+ Header : & block.Header {Nonce : 1 , Round : 1 },
3728+ })
3729+ require .Nil (t , err )
3730+ })
3731+
36253732 t .Run ("should work" , func (t * testing.T ) {
36263733 t .Parallel ()
36273734
@@ -3636,7 +3743,8 @@ func TestMetaProcessor_checkHeadersSequenceCorrectness(t *testing.T) {
36363743 return nil
36373744 },
36383745 },
3639- "blockTracker" : & integrationTestsMock.BlockTrackerStub {},
3746+ "enableEpochsHandler" : & enableEpochsHandlerMock.EnableEpochsHandlerStub {},
3747+ "blockTracker" : & integrationTestsMock.BlockTrackerStub {},
36403748 })
36413749 require .Nil (t , err )
36423750
0 commit comments