github.com/onflow/flow-go@v0.33.17/engine/execution/storehouse/executing_block_snapshot_test.go (about)

     1  package storehouse_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  
     8  	"github.com/onflow/flow-go/engine/execution/storehouse"
     9  	"github.com/onflow/flow-go/fvm/storage/snapshot"
    10  	"github.com/onflow/flow-go/model/flow"
    11  	"github.com/onflow/flow-go/utils/unittest"
    12  )
    13  
    14  func TestExtendingBlockSnapshot(t *testing.T) {
    15  	t.Run("Get register", func(t *testing.T) {
    16  		reg1 := makeReg("key1", "val1")
    17  		base := snapshot.MapStorageSnapshot{
    18  			reg1.Key: reg1.Value,
    19  		}
    20  		baseCommit := unittest.StateCommitmentFixture()
    21  		snap := storehouse.NewExecutingBlockSnapshot(base, baseCommit)
    22  
    23  		// should get value
    24  		value, err := snap.Get(reg1.Key)
    25  		require.NoError(t, err)
    26  		require.Equal(t, reg1.Value, value)
    27  
    28  		// should get nil for unknown register
    29  		unknown := makeReg("unknown", "unknownV")
    30  		value, err = snap.Get(unknown.Key)
    31  		require.NoError(t, err)
    32  		require.Equal(t, []byte(nil), value)
    33  	})
    34  
    35  	t.Run("Extend snapshot", func(t *testing.T) {
    36  		reg1 := makeReg("key1", "val1")
    37  		reg2 := makeReg("key2", "val2")
    38  		base := snapshot.MapStorageSnapshot{
    39  			reg1.Key: reg1.Value,
    40  			reg2.Key: reg2.Value,
    41  		}
    42  		// snap1: { key1: val1, key2: val2 }
    43  		snap1 := storehouse.NewExecutingBlockSnapshot(base, unittest.StateCommitmentFixture())
    44  
    45  		updatedReg2 := makeReg("key2", "val22")
    46  		reg3 := makeReg("key3", "val3")
    47  		// snap2: { key1: val1, key2: val22, key3: val3 }
    48  		snap2 := snap1.Extend(unittest.StateCommitmentFixture(), map[flow.RegisterID]flow.RegisterValue{
    49  			updatedReg2.Key: updatedReg2.Value,
    50  			reg3.Key:        reg3.Value,
    51  		})
    52  
    53  		// should get un-changed value
    54  		value, err := snap2.Get(reg1.Key)
    55  		require.NoError(t, err)
    56  		require.Equal(t, []byte("val1"), value)
    57  
    58  		value, err = snap2.Get(reg2.Key)
    59  		require.NoError(t, err)
    60  		require.Equal(t, []byte("val22"), value)
    61  
    62  		value, err = snap2.Get(reg3.Key)
    63  		require.NoError(t, err)
    64  		require.Equal(t, []byte("val3"), value)
    65  
    66  		// should get nil for unknown register
    67  		unknown := makeReg("unknown", "unknownV")
    68  		value, err = snap2.Get(unknown.Key)
    69  		require.NoError(t, err)
    70  		require.Equal(t, []byte(nil), value)
    71  
    72  		// create snap3 with reg3 updated
    73  		// snap3: { key1: val1, key2: val22, key3: val33 }
    74  		updatedReg3 := makeReg("key3", "val33")
    75  		snap3 := snap2.Extend(unittest.StateCommitmentFixture(), map[flow.RegisterID]flow.RegisterValue{
    76  			updatedReg3.Key: updatedReg3.Value,
    77  		})
    78  
    79  		// verify all keys
    80  		value, err = snap3.Get(reg1.Key)
    81  		require.NoError(t, err)
    82  		require.Equal(t, []byte("val1"), value)
    83  
    84  		value, err = snap3.Get(reg2.Key)
    85  		require.NoError(t, err)
    86  		require.Equal(t, []byte("val22"), value)
    87  
    88  		value, err = snap3.Get(reg3.Key)
    89  		require.NoError(t, err)
    90  		require.Equal(t, []byte("val33"), value)
    91  	})
    92  }