github.com/MetalBlockchain/metalgo@v1.11.9/x/merkledb/view_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package merkledb 5 6 import ( 7 "context" 8 "encoding/binary" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 13 "github.com/MetalBlockchain/metalgo/database" 14 "github.com/MetalBlockchain/metalgo/database/memdb" 15 "github.com/MetalBlockchain/metalgo/utils/hashing" 16 ) 17 18 var hashChangedNodesTests = []struct { 19 name string 20 numKeys uint64 21 expectedRootHash string 22 }{ 23 { 24 name: "1", 25 numKeys: 1, 26 expectedRootHash: "2A4DRkSWbTvSxgA1UMGp1Mpt1yzMFaeMMiDnrijVGJXPcRYiD4", 27 }, 28 { 29 name: "10", 30 numKeys: 10, 31 expectedRootHash: "2PGy7QvbYwVwn5QmLgj4KBgV2BisanZE8Nue2SxK9ffybb4mAn", 32 }, 33 { 34 name: "100", 35 numKeys: 100, 36 expectedRootHash: "LCeS4DWh6TpNKWH4ke9a2piSiwwLbmxGUj8XuaWx1XDGeCMAv", 37 }, 38 { 39 name: "1000", 40 numKeys: 1000, 41 expectedRootHash: "2S6f84wdRHmnx51mj35DF2owzf8wio5pzNJXfEWfFYFNxUB64T", 42 }, 43 { 44 name: "10000", 45 numKeys: 10000, 46 expectedRootHash: "wF6UnhaDoA9fAqiXAcx27xCYBK2aspDBEXkicmC7rs8EzLCD8", 47 }, 48 { 49 name: "100000", 50 numKeys: 100000, 51 expectedRootHash: "2Dy3RWZeNDUnUvzXpruB5xdp1V7xxb14M53ywdZVACDkdM66M1", 52 }, 53 } 54 55 func makeViewForHashChangedNodes(t require.TestingT, numKeys uint64, parallelism uint) *view { 56 config := newDefaultConfig() 57 config.RootGenConcurrency = parallelism 58 db, err := newDatabase( 59 context.Background(), 60 memdb.New(), 61 config, 62 &mockMetrics{}, 63 ) 64 require.NoError(t, err) 65 66 ops := make([]database.BatchOp, 0, numKeys) 67 for i := uint64(0); i < numKeys; i++ { 68 k := binary.AppendUvarint(nil, i) 69 ops = append(ops, database.BatchOp{ 70 Key: k, 71 Value: hashing.ComputeHash256(k), 72 }) 73 } 74 75 ctx := context.Background() 76 viewIntf, err := db.NewView(ctx, ViewChanges{BatchOps: ops}) 77 require.NoError(t, err) 78 79 view := viewIntf.(*view) 80 require.NoError(t, view.calculateNodeChanges(ctx)) 81 return view 82 } 83 84 func Test_HashChangedNodes(t *testing.T) { 85 for _, test := range hashChangedNodesTests { 86 t.Run(test.name, func(t *testing.T) { 87 view := makeViewForHashChangedNodes(t, test.numKeys, 16) 88 ctx := context.Background() 89 view.hashChangedNodes(ctx) 90 require.Equal(t, test.expectedRootHash, view.changes.rootID.String()) 91 }) 92 } 93 } 94 95 func Benchmark_HashChangedNodes(b *testing.B) { 96 for _, test := range hashChangedNodesTests { 97 view := makeViewForHashChangedNodes(b, test.numKeys, 1) 98 ctx := context.Background() 99 b.Run(test.name, func(b *testing.B) { 100 for i := 0; i < b.N; i++ { 101 view.hashChangedNodes(ctx) 102 } 103 }) 104 } 105 }