From 10b519a3e2ebaf71399f1de6ddfdf8cfec7f8113 Mon Sep 17 00:00:00 2001 From: Ori Newman Date: Thu, 14 Jan 2021 11:06:08 +0200 Subject: [PATCH] Add tests to ValidateHeaderInIsolation (#1415) * Add tests to ValidateHeaderInIsolation * Fix tests db names Co-authored-by: stasatdaglabs <39559713+stasatdaglabs@users.noreply.github.com> --- .../block_header_in_isolation_test.go | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 domain/consensus/processes/blockvalidator/block_header_in_isolation_test.go diff --git a/domain/consensus/processes/blockvalidator/block_header_in_isolation_test.go b/domain/consensus/processes/blockvalidator/block_header_in_isolation_test.go new file mode 100644 index 000000000..78d64afc1 --- /dev/null +++ b/domain/consensus/processes/blockvalidator/block_header_in_isolation_test.go @@ -0,0 +1,114 @@ +package blockvalidator_test + +import ( + "github.com/kaspanet/kaspad/domain/consensus" + "github.com/kaspanet/kaspad/domain/consensus/model" + "github.com/kaspanet/kaspad/domain/consensus/model/externalapi" + "github.com/kaspanet/kaspad/domain/consensus/ruleerrors" + "github.com/kaspanet/kaspad/domain/consensus/utils/blockheader" + "github.com/kaspanet/kaspad/domain/consensus/utils/constants" + "github.com/kaspanet/kaspad/domain/consensus/utils/testutils" + "github.com/kaspanet/kaspad/domain/dagconfig" + "github.com/kaspanet/kaspad/util/mstime" + "github.com/pkg/errors" + "testing" +) + +func TestCheckParentsLimit(t *testing.T) { + testutils.ForAllNets(t, true, func(t *testing.T, params *dagconfig.Params) { + factory := consensus.NewFactory() + + tc, teardown, err := factory.NewTestConsensus(params, false, "TestCheckParentsLimit") + if err != nil { + t.Fatalf("Error setting up consensus: %+v", err) + } + defer teardown(false) + + for i := model.KType(0); i < params.MaxBlockParents+1; i++ { + _, _, err = tc.AddBlock([]*externalapi.DomainHash{params.GenesisHash}, nil, nil) + if err != nil { + t.Fatalf("AddBlock: %+v", err) + } + } + + tips, err := tc.Tips() + if err != nil { + t.Fatalf("Tips: %+v", err) + } + + _, _, err = tc.AddBlock(tips, nil, nil) + if !errors.Is(err, ruleerrors.ErrTooManyParents) { + t.Fatalf("Unexpected error: %+v", err) + } + }) +} + +func TestCheckBlockVersion(t *testing.T) { + testutils.ForAllNets(t, true, func(t *testing.T, params *dagconfig.Params) { + factory := consensus.NewFactory() + + tc, teardown, err := factory.NewTestConsensus(params, false, "TestCheckBlockVersion") + if err != nil { + t.Fatalf("Error setting up consensus: %+v", err) + } + defer teardown(false) + + block, _, err := tc.BuildBlockWithParents([]*externalapi.DomainHash{params.GenesisHash}, nil, nil) + if err != nil { + t.Fatalf("BuildBlockWithParents: %+v", err) + } + + block.Header = blockheader.NewImmutableBlockHeader( + constants.MaxBlockVersion+1, + block.Header.ParentHashes(), + block.Header.HashMerkleRoot(), + block.Header.AcceptedIDMerkleRoot(), + block.Header.UTXOCommitment(), + block.Header.TimeInMilliseconds(), + block.Header.Bits(), + block.Header.Nonce(), + ) + + _, err = tc.ValidateAndInsertBlock(block) + if !errors.Is(err, ruleerrors.ErrBlockVersionIsUnknown) { + t.Fatalf("Unexpected error: %+v", err) + } + }) +} + +func TestCheckBlockTimestampInIsolation(t *testing.T) { + testutils.ForAllNets(t, true, func(t *testing.T, params *dagconfig.Params) { + factory := consensus.NewFactory() + + tc, teardown, err := factory.NewTestConsensus(params, false, "TestCheckBlockTimestampInIsolation") + if err != nil { + t.Fatalf("Error setting up consensus: %+v", err) + } + defer teardown(false) + + block, _, err := tc.BuildBlockWithParents([]*externalapi.DomainHash{params.GenesisHash}, nil, nil) + if err != nil { + t.Fatalf("BuildBlockWithParents: %+v", err) + } + + // Give 10 seconds slack to take care of the test duration + timestamp := mstime.Now().UnixMilliseconds() + + int64(params.TimestampDeviationTolerance)*params.TargetTimePerBlock.Milliseconds() + 10_000 + + block.Header = blockheader.NewImmutableBlockHeader( + block.Header.Version(), + block.Header.ParentHashes(), + block.Header.HashMerkleRoot(), + block.Header.AcceptedIDMerkleRoot(), + block.Header.UTXOCommitment(), + timestamp, + block.Header.Bits(), + block.Header.Nonce(), + ) + + _, err = tc.ValidateAndInsertBlock(block) + if !errors.Is(err, ruleerrors.ErrTimeTooMuchInTheFuture) { + t.Fatalf("Unexpected error: %+v", err) + } + }) +}