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 }