mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-10-14 00:59:33 +00:00

* [NOD-208] Added blockBlueScore to UTXOEntry. * [NOD-208] Added blueBlockScore to NewUTXOEntry. * [NOD-208] Fixed compilation errors in policy, utxoset, and dag tests. * [NOD-208] Changed validateBlockRewardMaturity and CheckTransactionInputsAndCalulateFee to use blueScore. * [NOD-208] Changed CalcBlockSubsidy to use blueScore. * [NOD-208] Changed SequenceLockActive to use blueScore. * [NOD-208] Removed ExtractCoinbaseHeight. * [NOD-208] Removed reference to block height in ensureNoDuplicateTx. * [NOD-208] Changed IsFinalizedTransaction to use blueScore. * [NOD-208] Fixed merge errors. * [NOD-208] Made UTXOEntry serialization use blueScore. * [NOD-208] Changed CalcPriority and calcInputValueAge to use blueScore. * [NOD-208] Changed calcSequenceLock to use blueScore. * [NOD-208] Removed blockChainHeight from UTXOEntry. * [NOD-208] Fixed compilation errors in feeEstimator. Fixed a bug in the test pool hardness. * [NOD-208] Fixed oldestChainBlockWithBlueScoreGreaterThan not handling an extreme case. * [NOD-208] Fixed TestDiffFromTx. * [NOD-208] Got rid of priority and support of free transactions. * [NOD-208] Fixed TestProcessTransaction. * [NOD-208] Fixed TestTxFeePrioHeap. * [NOD-208] Fixed TestAddrIndex and TestFeeEstimatorCfg. * [NOD-208] Removed unused rateLimit parameter from ProcessTransaction. * [NOD-208] Fixed tests that rely on CreateTxChain. * [NOD-208] Fixed tests that rely on CreateSignedTxForSubnetwork. * [NOD-208] Fixed TestFetchTransaction. * [NOD-208] Fixed TestHandleNewBlock. Fixed HandleNewBlock erroneously processing fee transactions. * [NOD-208] Fixed TestTxIndexConnectBlock. * [NOD-208] Removed the use of Height() from the fee estimator. * [NOD-208] Removed unused methods from rpcwebsocket.go. * [NOD-208] Removed Height from util.Block. * [NOD-208] Removed ErrForkTooOld. It doesn't make sense in a DAG. * [NOD-208] Made blockHeap use blueScore instead of height. * [NOD-208] Removed fee estimator. * [NOD-208] Removed DAG.Height. * [NOD-208] Made TestAncestorErrors test chainHeight instead of height. * [NOD-208] Fixed a couple of comments that were still speaking about block height. * [NOD-208] Replaced all uses of HighestTipHash with SelectedTipHash. * [NOD-208] Remove blockNode highest and some remaining erroneous uses of height. * [NOD-208] Fixed a couple of comments. Fixed outPoint -> outpoint merge error. * [NOD-208] Fixed a couple more comments. * [NOD-208] Used calcMinRequiredTxRelayFee instead of DefaultMinRelayTxFee for mempool tests. * [NOD-208] Renamed mempool Config BestHeight to DAGChainHeight. * [NOD-208] Fixed a bug in oldestChainBlockWithBlueScoreGreaterThan. Made calcSequenceLock use the node's selected parent chain rather than the virtual block's. * [NOD-208] Removed chainHeight from blockNode String(). Renamed checkpointsByHeight to checkpointsByChainHeight and prevCheckpointHeight to prevCheckpointChainHeight. Removed reference to chainHeight in blockIndexKey. Fixed comments in dagio.go. * [NOD-208] Removed indexers/blocklogger.go, as no one was using it. * [NOD-208] Made blocklogger.go log blueScore instead of height. * [NOD-208] Fixed typo. * [NOD-208] Fixed comments, did minor renaming. * [NOD-208] Made a "common sense" wrapper around sort.Search. * [NOD-208] Fixed comment in SearchSlice.
297 lines
7.5 KiB
Go
297 lines
7.5 KiB
Go
package blockdag
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/daglabs/btcd/util/daghash"
|
|
)
|
|
|
|
func TestHashes(t *testing.T) {
|
|
bs := setFromSlice(
|
|
&blockNode{
|
|
hash: &daghash.Hash{3},
|
|
},
|
|
&blockNode{
|
|
hash: &daghash.Hash{1},
|
|
},
|
|
&blockNode{
|
|
hash: &daghash.Hash{0},
|
|
},
|
|
&blockNode{
|
|
hash: &daghash.Hash{2},
|
|
},
|
|
)
|
|
|
|
expected := []*daghash.Hash{
|
|
{0},
|
|
{1},
|
|
{2},
|
|
{3},
|
|
}
|
|
|
|
hashes := bs.hashes()
|
|
if !daghash.AreEqual(hashes, expected) {
|
|
t.Errorf("TestHashes: hashes order is %s but expected %s", hashes, expected)
|
|
}
|
|
}
|
|
|
|
func TestBlockSetSubtract(t *testing.T) {
|
|
node1 := &blockNode{hash: &daghash.Hash{10}}
|
|
node2 := &blockNode{hash: &daghash.Hash{20}}
|
|
node3 := &blockNode{hash: &daghash.Hash{30}}
|
|
|
|
tests := []struct {
|
|
name string
|
|
setA blockSet
|
|
setB blockSet
|
|
expectedResult blockSet
|
|
}{
|
|
{
|
|
name: "both sets empty",
|
|
setA: setFromSlice(),
|
|
setB: setFromSlice(),
|
|
expectedResult: setFromSlice(),
|
|
},
|
|
{
|
|
name: "subtract an empty set",
|
|
setA: setFromSlice(node1),
|
|
setB: setFromSlice(),
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
{
|
|
name: "subtract from empty set",
|
|
setA: setFromSlice(),
|
|
setB: setFromSlice(node1),
|
|
expectedResult: setFromSlice(),
|
|
},
|
|
{
|
|
name: "subtract unrelated set",
|
|
setA: setFromSlice(node1),
|
|
setB: setFromSlice(node2),
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
{
|
|
name: "typical case",
|
|
setA: setFromSlice(node1, node2),
|
|
setB: setFromSlice(node2, node3),
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result := test.setA.subtract(test.setB)
|
|
if !reflect.DeepEqual(result, test.expectedResult) {
|
|
t.Errorf("blockSet.subtract: unexpected result in test '%s'. "+
|
|
"Expected: %v, got: %v", test.name, test.expectedResult, result)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBlockSetAddSet(t *testing.T) {
|
|
node1 := &blockNode{hash: &daghash.Hash{10}}
|
|
node2 := &blockNode{hash: &daghash.Hash{20}}
|
|
node3 := &blockNode{hash: &daghash.Hash{30}}
|
|
|
|
tests := []struct {
|
|
name string
|
|
setA blockSet
|
|
setB blockSet
|
|
expectedResult blockSet
|
|
}{
|
|
{
|
|
name: "both sets empty",
|
|
setA: setFromSlice(),
|
|
setB: setFromSlice(),
|
|
expectedResult: setFromSlice(),
|
|
},
|
|
{
|
|
name: "add an empty set",
|
|
setA: setFromSlice(node1),
|
|
setB: setFromSlice(),
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
{
|
|
name: "add to empty set",
|
|
setA: setFromSlice(),
|
|
setB: setFromSlice(node1),
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
{
|
|
name: "add already added member",
|
|
setA: setFromSlice(node1, node2),
|
|
setB: setFromSlice(node1),
|
|
expectedResult: setFromSlice(node1, node2),
|
|
},
|
|
{
|
|
name: "typical case",
|
|
setA: setFromSlice(node1, node2),
|
|
setB: setFromSlice(node2, node3),
|
|
expectedResult: setFromSlice(node1, node2, node3),
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
test.setA.addSet(test.setB)
|
|
if !reflect.DeepEqual(test.setA, test.expectedResult) {
|
|
t.Errorf("blockSet.addSet: unexpected result in test '%s'. "+
|
|
"Expected: %v, got: %v", test.name, test.expectedResult, test.setA)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBlockSetAddSlice(t *testing.T) {
|
|
node1 := &blockNode{hash: &daghash.Hash{10}}
|
|
node2 := &blockNode{hash: &daghash.Hash{20}}
|
|
node3 := &blockNode{hash: &daghash.Hash{30}}
|
|
|
|
tests := []struct {
|
|
name string
|
|
set blockSet
|
|
slice []*blockNode
|
|
expectedResult blockSet
|
|
}{
|
|
{
|
|
name: "add empty slice to empty set",
|
|
set: setFromSlice(),
|
|
slice: []*blockNode{},
|
|
expectedResult: setFromSlice(),
|
|
},
|
|
{
|
|
name: "add an empty slice",
|
|
set: setFromSlice(node1),
|
|
slice: []*blockNode{},
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
{
|
|
name: "add to empty set",
|
|
set: setFromSlice(),
|
|
slice: []*blockNode{node1},
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
{
|
|
name: "add already added member",
|
|
set: setFromSlice(node1, node2),
|
|
slice: []*blockNode{node1},
|
|
expectedResult: setFromSlice(node1, node2),
|
|
},
|
|
{
|
|
name: "typical case",
|
|
set: setFromSlice(node1, node2),
|
|
slice: []*blockNode{node2, node3},
|
|
expectedResult: setFromSlice(node1, node2, node3),
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
test.set.addSlice(test.slice)
|
|
if !reflect.DeepEqual(test.set, test.expectedResult) {
|
|
t.Errorf("blockSet.addSlice: unexpected result in test '%s'. "+
|
|
"Expected: %v, got: %v", test.name, test.expectedResult, test.set)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBlockSetUnion(t *testing.T) {
|
|
node1 := &blockNode{hash: &daghash.Hash{10}}
|
|
node2 := &blockNode{hash: &daghash.Hash{20}}
|
|
node3 := &blockNode{hash: &daghash.Hash{30}}
|
|
|
|
tests := []struct {
|
|
name string
|
|
setA blockSet
|
|
setB blockSet
|
|
expectedResult blockSet
|
|
}{
|
|
{
|
|
name: "both sets empty",
|
|
setA: setFromSlice(),
|
|
setB: setFromSlice(),
|
|
expectedResult: setFromSlice(),
|
|
},
|
|
{
|
|
name: "union against an empty set",
|
|
setA: setFromSlice(node1),
|
|
setB: setFromSlice(),
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
{
|
|
name: "union from an empty set",
|
|
setA: setFromSlice(),
|
|
setB: setFromSlice(node1),
|
|
expectedResult: setFromSlice(node1),
|
|
},
|
|
{
|
|
name: "union with subset",
|
|
setA: setFromSlice(node1, node2),
|
|
setB: setFromSlice(node1),
|
|
expectedResult: setFromSlice(node1, node2),
|
|
},
|
|
{
|
|
name: "typical case",
|
|
setA: setFromSlice(node1, node2),
|
|
setB: setFromSlice(node2, node3),
|
|
expectedResult: setFromSlice(node1, node2, node3),
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result := test.setA.union(test.setB)
|
|
if !reflect.DeepEqual(result, test.expectedResult) {
|
|
t.Errorf("blockSet.union: unexpected result in test '%s'. "+
|
|
"Expected: %v, got: %v", test.name, test.expectedResult, result)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBlockSetHashesEqual(t *testing.T) {
|
|
node1 := &blockNode{hash: &daghash.Hash{10}}
|
|
node2 := &blockNode{hash: &daghash.Hash{20}}
|
|
|
|
tests := []struct {
|
|
name string
|
|
set blockSet
|
|
hashes []*daghash.Hash
|
|
expectedResult bool
|
|
}{
|
|
{
|
|
name: "empty set, no hashes",
|
|
set: setFromSlice(),
|
|
hashes: []*daghash.Hash{},
|
|
expectedResult: true,
|
|
},
|
|
{
|
|
name: "empty set, one hash",
|
|
set: setFromSlice(),
|
|
hashes: []*daghash.Hash{node1.hash},
|
|
expectedResult: false,
|
|
},
|
|
{
|
|
name: "set and hashes of different length",
|
|
set: setFromSlice(node1, node2),
|
|
hashes: []*daghash.Hash{node1.hash},
|
|
expectedResult: false,
|
|
},
|
|
{
|
|
name: "set equal to hashes",
|
|
set: setFromSlice(node1, node2),
|
|
hashes: []*daghash.Hash{node1.hash, node2.hash},
|
|
expectedResult: true,
|
|
},
|
|
{
|
|
name: "set equal to hashes, different order",
|
|
set: setFromSlice(node1, node2),
|
|
hashes: []*daghash.Hash{node2.hash, node1.hash},
|
|
expectedResult: true,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result := test.set.hashesEqual(test.hashes)
|
|
if result != test.expectedResult {
|
|
t.Errorf("blockSet.hashesEqual: unexpected result in test '%s'. "+
|
|
"Expected: %t, got: %t", test.name, test.expectedResult, result)
|
|
}
|
|
}
|
|
}
|