kaspad/domain/consensus/processes/dagtraversalmanager/dagtraversalmanager_test.go
D-Stacks a4d9fa10bf
fix typo (#2060)
Co-authored-by: Ori Newman <orinewman1@gmail.com>
2022-05-25 10:17:58 +03:00

118 lines
3.6 KiB
Go

package dagtraversalmanager_test
import (
"testing"
"github.com/kaspanet/kaspad/domain/consensus/model"
"github.com/kaspanet/kaspad/domain/consensus"
"github.com/kaspanet/kaspad/domain/consensus/model/externalapi"
"github.com/kaspanet/kaspad/domain/consensus/utils/testutils"
)
func TestLowestChainBlockAboveOrEqualToBlueScore(t *testing.T) {
testutils.ForAllNets(t, true, func(t *testing.T, consensusConfig *consensus.Config) {
consensusConfig.FinalityDuration = 10 * consensusConfig.TargetTimePerBlock
factory := consensus.NewFactory()
tc, tearDown, err := factory.NewTestConsensus(consensusConfig,
"TestLowestChainBlockAboveOrEqualToBlueScore")
if err != nil {
t.Fatalf("NewTestConsensus: %s", err)
}
defer tearDown(false)
stagingArea := model.NewStagingArea()
checkExpectedBlock := func(highHash *externalapi.DomainHash, blueScore uint64, expected *externalapi.DomainHash) {
blockHash, err := tc.DAGTraversalManager().LowestChainBlockAboveOrEqualToBlueScore(stagingArea, highHash, blueScore)
if err != nil {
t.Fatalf("LowestChainBlockAboveOrEqualToBlueScore: %+v", err)
}
if !blockHash.Equal(expected) {
t.Fatalf("Expected block %s but got %s", expected, blockHash)
}
}
checkBlueScore := func(blockHash *externalapi.DomainHash, expectedBlueScore uint64) {
ghostdagData, err := tc.GHOSTDAGDataStore().Get(tc.DatabaseContext(), stagingArea, blockHash, false)
if err != nil {
t.Fatalf("GHOSTDAGDataStore().Get: %+v", err)
}
if ghostdagData.BlueScore() != expectedBlueScore {
t.Fatalf("Expected blue score %d but got %d", expectedBlueScore, ghostdagData.BlueScore())
}
}
chain := []*externalapi.DomainHash{consensusConfig.GenesisHash}
tipHash := consensusConfig.GenesisHash
for i := 0; i < 9; i++ {
var err error
tipHash, _, err = tc.AddBlock([]*externalapi.DomainHash{tipHash}, nil, nil)
if err != nil {
t.Fatalf("AddBlock: %+v", err)
}
chain = append(chain, tipHash)
}
sideChain1TipHash, _, err := tc.AddBlock([]*externalapi.DomainHash{consensusConfig.GenesisHash}, nil, nil)
if err != nil {
t.Fatalf("AddBlock: %+v", err)
}
tipHash, _, err = tc.AddBlock([]*externalapi.DomainHash{sideChain1TipHash, tipHash}, nil, nil)
if err != nil {
t.Fatalf("AddBlock: %+v", err)
}
chain = append(chain, tipHash)
blueScore11BlockHash := tipHash
checkBlueScore(blueScore11BlockHash, 11)
for i := 0; i < 5; i++ {
var err error
tipHash, _, err = tc.AddBlock([]*externalapi.DomainHash{tipHash}, nil, nil)
if err != nil {
t.Fatalf("AddBlock: %+v", err)
}
chain = append(chain, tipHash)
}
sideChain2TipHash, _, err := tc.AddBlock([]*externalapi.DomainHash{consensusConfig.GenesisHash}, nil, nil)
if err != nil {
t.Fatalf("AddBlock: %+v", err)
}
tipHash, _, err = tc.AddBlock([]*externalapi.DomainHash{sideChain2TipHash, tipHash}, nil, nil)
if err != nil {
t.Fatalf("AddBlock: %+v", err)
}
chain = append(chain, tipHash)
blueScore18BlockHash := tipHash
checkBlueScore(blueScore18BlockHash, 18)
for i := 0; i < 3; i++ {
var err error
tipHash, _, err = tc.AddBlock([]*externalapi.DomainHash{tipHash}, nil, nil)
if err != nil {
t.Fatalf("AddBlock: %+v", err)
}
chain = append(chain, tipHash)
}
// Check by exact blue score
checkExpectedBlock(tipHash, 0, consensusConfig.GenesisHash)
checkExpectedBlock(tipHash, 5, chain[5])
checkExpectedBlock(tipHash, 19, chain[len(chain)-3])
// Check by non exact blue score
checkExpectedBlock(tipHash, 17, blueScore18BlockHash)
checkExpectedBlock(tipHash, 10, blueScore11BlockHash)
})
}