go-ethereum/trie/concurrent_iterator/iterator_test.go
Michael Shaw a67810615a conflicts resolved no testing
update tests, helper methods, etc for changed interfaces

linted and some tests updated... statediff tests failing on filesystem call locally

undo changes to go.mod from rebase

changed ref and repo to try old stack-orch with miner.etherbase arg

turn off new tests yml for old tests with hack for old stack-orchestrator
2023-03-03 09:23:25 -05:00

102 lines
2.7 KiB
Go

package iterator_test
import (
"bytes"
"fmt"
"testing"
"github.com/ethereum/go-ethereum/core/rawdb"
"github.com/ethereum/go-ethereum/core/state"
iter "github.com/ethereum/go-ethereum/trie/concurrent_iterator"
fixt "github.com/ethereum/go-ethereum/trie/concurrent_iterator/fixture"
)
func TestMakePaths(t *testing.T) {
var prefix []byte
for i := 0; i < 4; i++ {
nbins := uint(1) << i
paths := iter.MakePaths(prefix, nbins)
if len(paths) != int(nbins) {
t.Errorf("wrong number of paths; expected %d, have %d", nbins, len(paths))
}
}
}
func TestIterator(t *testing.T) {
kvdb, ldberr := rawdb.NewLevelDBDatabase(fixt.ChainDataPath, 1024, 256, "eth-pg-ipfs-state-snapshot", false)
if ldberr != nil {
t.Fatal(ldberr)
}
edb, err := rawdb.NewDatabaseWithFreezer(kvdb, fixt.AncientDataPath, "eth-pg-ipfs-state-snapshot", false)
if err != nil {
t.Fatal(err)
}
defer edb.Close()
height := uint64(1)
hash := rawdb.ReadCanonicalHash(edb, height)
header := rawdb.ReadHeader(edb, hash, height)
if header == nil {
t.Fatalf("unable to read canonical header at height %d", height)
}
sdb := state.NewDatabase(edb)
tree, err := sdb.OpenTrie(header.Root)
if err != nil {
t.Fatal(err)
}
t.Run("in bounds", func(t *testing.T) {
type testCase struct {
lower, upper []byte
}
cases := []testCase{
{nil, []byte{0, 0}},
{[]byte{1, 0}, []byte{2, 0}},
{[]byte{3, 5}, []byte{4, 2, 0}},
{[]byte{5, 6, 9, 0}, []byte{7, 0}},
{[]byte{8, 0}, []byte{8, 0}},
{[]byte{8, 0}, []byte{7, 0}},
}
runCase := func(t *testing.T, tc testCase) {
it := iter.NewPrefixBoundIterator(tree.NodeIterator(iter.HexToKeyBytes(tc.lower)), tc.lower, tc.upper)
for it.Next(true) {
if bytes.Compare(it.Path(), tc.lower) < 0 {
t.Fatalf("iterator outside lower bound: %v", it.Path())
}
if bytes.Compare(tc.upper, it.Path()) < 0 {
t.Fatalf("iterator outside upper bound: %v <= %v", tc.upper, it.Path())
}
}
}
for _, tc := range cases {
t.Run("case", func(t *testing.T) { runCase(t, tc) })
}
})
t.Run("trie is covered", func(t *testing.T) {
allPaths := fixt.Block1_Paths
cases := []uint{1, 2, 4, 8, 16, 32}
runCase := func(t *testing.T, nbins uint) {
iters := iter.SubtrieIterators(tree, nbins)
ix := 0
for b := uint(0); b < nbins; b++ {
for it := iters[b]; it.Next(true); ix++ {
if !bytes.Equal(allPaths[ix], it.Path()) {
t.Fatalf("wrong path value\nexpected:\t%v\nactual:\t\t%v",
allPaths[ix], it.Path())
}
}
// if the last node path was even-length, it will be duplicated
if len(allPaths[ix-1])&0b1 == 0 {
ix--
}
}
}
for _, tc := range cases {
t.Run(fmt.Sprintf("%d bins", tc), func(t *testing.T) { runCase(t, tc) })
}
})
}