github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/engine/execution/computation/committer/committer_test.go (about) 1 package committer_test 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/stretchr/testify/mock" 8 "github.com/stretchr/testify/require" 9 10 "github.com/onflow/flow-go/engine/execution/computation/committer" 11 "github.com/onflow/flow-go/engine/execution/storehouse" 12 "github.com/onflow/flow-go/fvm/storage/snapshot" 13 "github.com/onflow/flow-go/ledger" 14 "github.com/onflow/flow-go/ledger/common/convert" 15 "github.com/onflow/flow-go/ledger/common/pathfinder" 16 "github.com/onflow/flow-go/ledger/complete" 17 ledgermock "github.com/onflow/flow-go/ledger/mock" 18 "github.com/onflow/flow-go/model/flow" 19 "github.com/onflow/flow-go/module/trace" 20 "github.com/onflow/flow-go/utils/unittest" 21 ) 22 23 func TestLedgerViewCommitter(t *testing.T) { 24 25 // verify after committing a snapshot, proof will be generated, 26 // and changes are saved in storage snapshot 27 t.Run("CommitView should return proof and statecommitment", func(t *testing.T) { 28 29 l := ledgermock.NewLedger(t) 30 committer := committer.NewLedgerViewCommitter(l, trace.NewNoopTracer()) 31 32 // CommitDelta will call ledger.Set and ledger.Prove 33 34 reg := unittest.MakeOwnerReg("key1", "val1") 35 startState := unittest.StateCommitmentFixture() 36 37 update, err := ledger.NewUpdate(ledger.State(startState), []ledger.Key{convert.RegisterIDToLedgerKey(reg.Key)}, []ledger.Value{reg.Value}) 38 require.NoError(t, err) 39 40 expectedTrieUpdate, err := pathfinder.UpdateToTrieUpdate(update, complete.DefaultPathFinderVersion) 41 require.NoError(t, err) 42 43 endState := unittest.StateCommitmentFixture() 44 require.NotEqual(t, startState, endState) 45 46 // mock ledger.Set 47 l.On("Set", mock.Anything). 48 Return(func(update *ledger.Update) (newState ledger.State, trieUpdate *ledger.TrieUpdate, err error) { 49 if update.State().Equals(ledger.State(startState)) { 50 return ledger.State(endState), expectedTrieUpdate, nil 51 } 52 return ledger.DummyState, nil, fmt.Errorf("wrong update") 53 }). 54 Once() 55 56 // mock ledger.Prove 57 expectedProof := ledger.Proof([]byte{2, 3, 4}) 58 l.On("Prove", mock.Anything). 59 Return(func(query *ledger.Query) (proof ledger.Proof, err error) { 60 if query.Size() != 1 { 61 return nil, fmt.Errorf("wrong query size: %v", query.Size()) 62 } 63 64 k := convert.RegisterIDToLedgerKey(reg.Key) 65 if !query.Keys()[0].Equals(&k) { 66 return nil, fmt.Errorf("in correct query key for prove: %v", query.Keys()[0]) 67 } 68 69 return expectedProof, nil 70 }). 71 Once() 72 73 // previous block's storage snapshot 74 oldReg := unittest.MakeOwnerReg("key1", "oldvalue") 75 previousBlockSnapshot := storehouse.NewExecutingBlockSnapshot( 76 snapshot.MapStorageSnapshot{ 77 oldReg.Key: oldReg.Value, 78 }, 79 flow.StateCommitment(update.State()), 80 ) 81 82 // this block's register updates 83 blockUpdates := &snapshot.ExecutionSnapshot{ 84 WriteSet: map[flow.RegisterID]flow.RegisterValue{ 85 reg.Key: oldReg.Value, 86 }, 87 } 88 89 newCommit, proof, trieUpdate, newStorageSnapshot, err := committer.CommitView( 90 blockUpdates, 91 previousBlockSnapshot, 92 ) 93 94 require.NoError(t, err) 95 96 // verify CommitView returns expected proof and statecommitment 97 require.Equal(t, previousBlockSnapshot.Commitment(), flow.StateCommitment(trieUpdate.RootHash)) 98 require.Equal(t, newCommit, newStorageSnapshot.Commitment()) 99 require.Equal(t, endState, newCommit) 100 require.Equal(t, []uint8(expectedProof), proof) 101 require.True(t, expectedTrieUpdate.Equals(trieUpdate)) 102 103 }) 104 105 }