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  }