github.com/MetalBlockchain/metalgo@v1.11.9/vms/platformvm/state/disk_staker_diff_iterator_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 state
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  	"github.com/thepudds/fzgen/fuzzer"
    11  
    12  	"github.com/MetalBlockchain/metalgo/database/memdb"
    13  	"github.com/MetalBlockchain/metalgo/ids"
    14  )
    15  
    16  func FuzzMarshalDiffKey(f *testing.F) {
    17  	f.Fuzz(func(t *testing.T, data []byte) {
    18  		require := require.New(t)
    19  
    20  		var (
    21  			subnetID ids.ID
    22  			height   uint64
    23  			nodeID   ids.NodeID
    24  		)
    25  		fz := fuzzer.NewFuzzer(data)
    26  		fz.Fill(&subnetID, &height, &nodeID)
    27  
    28  		key := marshalDiffKey(subnetID, height, nodeID)
    29  		parsedSubnetID, parsedHeight, parsedNodeID, err := unmarshalDiffKey(key)
    30  		require.NoError(err)
    31  		require.Equal(subnetID, parsedSubnetID)
    32  		require.Equal(height, parsedHeight)
    33  		require.Equal(nodeID, parsedNodeID)
    34  	})
    35  }
    36  
    37  func FuzzUnmarshalDiffKey(f *testing.F) {
    38  	f.Fuzz(func(t *testing.T, key []byte) {
    39  		require := require.New(t)
    40  
    41  		subnetID, height, nodeID, err := unmarshalDiffKey(key)
    42  		if err != nil {
    43  			require.ErrorIs(err, errUnexpectedDiffKeyLength)
    44  			return
    45  		}
    46  
    47  		formattedKey := marshalDiffKey(subnetID, height, nodeID)
    48  		require.Equal(key, formattedKey)
    49  	})
    50  }
    51  
    52  func TestDiffIteration(t *testing.T) {
    53  	require := require.New(t)
    54  
    55  	db := memdb.New()
    56  
    57  	subnetID0 := ids.GenerateTestID()
    58  	subnetID1 := ids.GenerateTestID()
    59  
    60  	nodeID0 := ids.BuildTestNodeID([]byte{0x00})
    61  	nodeID1 := ids.BuildTestNodeID([]byte{0x01})
    62  
    63  	subnetID0Height0NodeID0 := marshalDiffKey(subnetID0, 0, nodeID0)
    64  	subnetID0Height1NodeID0 := marshalDiffKey(subnetID0, 1, nodeID0)
    65  	subnetID0Height1NodeID1 := marshalDiffKey(subnetID0, 1, nodeID1)
    66  
    67  	subnetID1Height0NodeID0 := marshalDiffKey(subnetID1, 0, nodeID0)
    68  	subnetID1Height1NodeID0 := marshalDiffKey(subnetID1, 1, nodeID0)
    69  	subnetID1Height1NodeID1 := marshalDiffKey(subnetID1, 1, nodeID1)
    70  
    71  	require.NoError(db.Put(subnetID0Height0NodeID0, nil))
    72  	require.NoError(db.Put(subnetID0Height1NodeID0, nil))
    73  	require.NoError(db.Put(subnetID0Height1NodeID1, nil))
    74  	require.NoError(db.Put(subnetID1Height0NodeID0, nil))
    75  	require.NoError(db.Put(subnetID1Height1NodeID0, nil))
    76  	require.NoError(db.Put(subnetID1Height1NodeID1, nil))
    77  
    78  	{
    79  		it := db.NewIteratorWithStartAndPrefix(marshalStartDiffKey(subnetID0, 0), subnetID0[:])
    80  		defer it.Release()
    81  
    82  		expectedKeys := [][]byte{
    83  			subnetID0Height0NodeID0,
    84  		}
    85  		for _, expectedKey := range expectedKeys {
    86  			require.True(it.Next())
    87  			require.Equal(expectedKey, it.Key())
    88  		}
    89  		require.False(it.Next())
    90  		require.NoError(it.Error())
    91  	}
    92  
    93  	{
    94  		it := db.NewIteratorWithStartAndPrefix(marshalStartDiffKey(subnetID0, 1), subnetID0[:])
    95  		defer it.Release()
    96  
    97  		expectedKeys := [][]byte{
    98  			subnetID0Height1NodeID0,
    99  			subnetID0Height1NodeID1,
   100  			subnetID0Height0NodeID0,
   101  		}
   102  		for _, expectedKey := range expectedKeys {
   103  			require.True(it.Next())
   104  			require.Equal(expectedKey, it.Key())
   105  		}
   106  		require.False(it.Next())
   107  		require.NoError(it.Error())
   108  	}
   109  }