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 }